回答
撇開第二個構造函數不是複製構造函數 - 你實際上想知道何時會調用第二個構造函數。
的Foo(Foo* obj);
構造是單參數的構造 - 因爲它沒有被標有explicit
關鍵字,它提供了從Foo*
到Foo
的隱式轉換。可以在任何時候調用Foo*
代替Foo
或const Foo&
--如果意外調用它,幾乎可以肯定發生了什麼。
一般來說,單參數構造函數應該是複製構造函數(其他答案已經解釋過)或者應該標記爲explicit
。它們提供隱式轉換的構造應謹慎使用。
不,你沒有 - 你有一個拷貝構造函數
Foo(Foo * obj);
不是一個拷貝構造函數,絕不會由C++編譯器可以用作這樣的。你當然可以自己使用它:
Foo a;
Foo b(& a); // use your constructor
還要注意你的真正的拷貝構造函數應該聲明爲;
Foo(const Foo & f);
儘管缺乏const並不妨礙它成爲拷貝構造函數。
第二個是不是一個拷貝構造函數。這是一個當你創建一個新的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
您可以添加案例Foo * pfoo = new Foo; Foo foo4(pfoo); – 2010-03-22 12:53:38
你的一個構造函數是一個拷貝構造函數,另一種是隻是一個普通的構造函數。如果顯式初始化從一個指針一個Foo
到Foo
或者在從一個指針到Foo
到的r值Foo
的轉換稱爲用於其它情況,如參數傳遞和函數返回
第二將被調用。
有這樣的隱式轉換通常是一個壞主意;當你不希望它是有可能把從編譯錯誤瑣碎錯別字到不尋常的行爲在運行時可能發生。
- 1. 的拷貝構造函數
- 2. 拷貝構造函數
- 3. 拷貝構造函數knowlege
- 4. 拷貝構造函數++
- 5. 用模板拷貝構造函數替換默認拷貝構造函數
- 6. 拷貝構造函數和函數從
- 7. D結構體拷貝構造函數
- 8. 拷貝構造
- 9. Java的ArrayList的拷貝構造函數
- 10. 拷貝賦值爲未實現的拷貝構造函數
- 11. 基類的拷貝構造函數(C++)
- 12. C++中的拷貝構造函數
- 13. 奇怪的拷貝構造函數
- 14. Java的拷貝構造函數
- 15. C++默認的拷貝構造函數
- 16. shared_ptr的拷貝構造函數裏面
- 17. 新圖的深拷貝構造函數
- 18. 錯誤的拷貝構造函數
- 19. 拷貝構造函數的區別?
- 20. Java ArrayList的拷貝構造函數是淺拷貝還是深拷貝?
- 21. 如何在BaseClass拷貝構造函數中拷貝SubClass對象
- 22. 移動構造函數和非常拷貝構造函數
- 23. 模板拷貝構造函數
- 24. C++幫助拷貝構造函數
- 25. cliext ::向量和拷貝構造函數
- 26. C++中拷貝構造函數
- 27. 一個拷貝構造函數調用
- 28. 拷貝構造函數在C++
- 29. 拷貝構造函數叫錯
- 30. 拷貝構造函數和operator =在C++
這是我的錯誤第二個不是複製構造函數 只是想知道什麼時候第二個函數被調用? Foo foo3(&foo0);解決了它 – anish 2010-03-22 11:42:50