回答
撇開第二個構造函數不是複製構造函數 - 你實際上想知道何時會調用第二個構造函數。
的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. 拷貝構造函數knowlege
- 3. 拷貝構造函數++
- 4. D結構體拷貝構造函數
- 5. Java的ArrayList的拷貝構造函數
- 6. 拷貝賦值爲未實現的拷貝構造函數
- 7. C++中的拷貝構造函數
- 8. 基類的拷貝構造函數(C++)
- 9. Java的拷貝構造函數
- 10. 拷貝構造函數的區別?
- 11. 錯誤的拷貝構造函數
- 12. 新圖的深拷貝構造函數
- 13. Java ArrayList的拷貝構造函數是淺拷貝還是深拷貝?
- 14. 移動構造函數和非常拷貝構造函數
- 15. 拷貝構造函數不叫
- 16. 拷貝構造函數在C++
- 17. 私人拷貝構造函數:disallow
- 18. 堆棧拷貝構造函數
- 19. 通用C#拷貝構造函數
- 20. c#拷貝構造函數生成器
- 21. 避免向量拷貝構造函數
- 22. 模板拷貝構造函數
- 23. C#泛型拷貝構造函數
- 24. C++默認拷貝構造函數
- 25. C++拷貝構造函數語法
- 26. C++ std :: auto_ptr拷貝構造函數
- 27. 一個拷貝構造函數調用
- 28. 段錯誤拷貝構造函數
- 29. 指針和拷貝構造函數C++
- 30. 拷貝構造函數不被調用?
這是我的錯誤第二個不是複製構造函數 只是想知道什麼時候第二個函數被調用? Foo foo3(&foo0);解決了它 – anish 2010-03-22 11:42:50