2010-03-22 102 views
1

我有兩個拷貝構造函數拷貝構造函數的地址

Foo(Foo &obj){ 

} 
Foo(Foo *obj){ 

} 

當將第二拷貝構造函數將被調用?

+0

這是我的錯誤第二個不是複製構造函數 只是想知道什麼時候第二個函數被調用? Foo foo3(&foo0);解決了它 – anish 2010-03-22 11:42:50

回答

5

撇開第二個構造函數不是複製構造函數 - 你實際上想知道何時會調用第二個構造函數。

Foo(Foo* obj);構造是單參數的構造 - 因爲它沒有被標有explicit關鍵字,它提供了從Foo*Foo的隱式轉換。可以在任何時候調用Foo*代替Fooconst Foo&--如果意外調用它,幾乎可以肯定發生了什麼。

一般來說,單參數構造函數應該是複製構造函數(其他答案已經解釋過)或者應該標記爲explicit。它們提供隱式轉換的構造應謹慎使用。

10

不,你沒有 - 你有一個拷貝構造函數

Foo(Foo * obj); 

不是一個拷貝構造函數,絕不會由C++編譯器可以用作這樣的。你當然可以自己使用它:

Foo a; 
Foo b(& a); // use your constructor 

還要注意你的真正的拷貝構造函數應該聲明爲;

Foo(const Foo & f); 

儘管缺乏const並不妨礙它成爲拷貝構造函數。

2

第二個是不是一個拷貝構造函數。這是一個當你創建一個新的Foo對象被調用,給人一種指向一個Foo爲參數的構造函數。

Foo foo0; 
Foo foo1 = foo0; // Calls copy constructor 
Foo foo2(foo0); // Calls copy constructor 
Foo foo3(&foo0); // Calls constructor taking a pointer as parameter 
+0

您可以添加案例Foo * pfoo = new Foo; Foo foo4(pfoo); – 2010-03-22 12:53:38

2

你的一個構造函數是一個拷貝構造函數,另一種是隻是一個普通的構造函數。如果顯式初始化從一個指針一個FooFoo或者在從一個指針到Foo到的r值Foo的轉換稱爲用於其它情況,如參數傳遞和函數返回

第二將被調用。

有這樣的隱式轉換通常是一個壞主意;當你不希望它是有可能把從編譯錯誤瑣碎錯別字到不尋常的行爲在運行時可能發生。