class member
{
public:
member()
{
cout<<"Calling member constr"<<'\n';
}
member(const member&)
{
cout<<"Calling member copy constr"<<'\n';
}
};
class fred
{
public:
fred()
{
cout<<"calling fred constr"<<'\n';
}
fred(const fred &)
{
cout<<"Calling fred copy constr"<<'\n';
}
protected:
member member_;
};
int main()
{
fred a;
fred b=a;
}
Output:
Calling member constr
calling fred constr
**Calling member constr**
Calling fred copy constr
2
A
回答
16
因爲您沒有撥打member
的複製構造函數。如果您覆蓋默認的複製構造函數fred
,則需要明確複製成員。
fred(const fred& other) : member_(other.member_) {
cout<<"Calling fred copy constr"<<'\n';
}
6
它沒有被調用,因爲你明確要求編譯器不要調用它。當你爲類fred
定義你自己的拷貝構造函數時,你基本上告訴編譯器,你想把事情交到你的手中,並自己進行拷貝。由於您不需要複製fred
的拷貝構造函數中的member_
,因此不會被複制。
如果您擺脫fred
明確定義的拷貝構造函數,編譯器會提供一個隱含的一個給你,它會調用member
的拷貝構造函數來複制member_
。如KennyTM所建議的,如果您堅持自己定義fred
的拷貝構造函數,則必須親自複製member_
。
0
如果A類有一個B類成員,並且您明確實現了A類的副本,那麼您必須明確地複製那裏的成員,在這種情況下調用B副本,否則B成員將被默認構造,不復制構建。
0
在這種情況下,您必須明確地調用它。因爲,你有重載的構造函數。
順便說一句,當我看到「弗雷德」,它讓我想起了這個有用的資源,請有找的C++構造進一步的瞭解:http://www.parashift.com/c++-faq-lite/ctors.html
相關問題
- 1. 爲什麼隱式拷貝構造函數調用基類拷貝構造函數並且定義的拷貝構造函數沒有?
- 2. 成員函數的調用拷貝構造函數
- 3. C++中的隱式定義的拷貝構造函數是否也爲成員調用拷貝構造函數?
- 4. 爲什麼CAsyncSocket沒有拷貝構造函數或=操作符?
- 5. 爲什麼不NRVO沒有拷貝構造函數工作
- 6. 爲什麼我的拷貝構造函數不被調用?
- 7. 爲什麼在這裏調用拷貝構造函數?
- 8. 爲什麼map.insert()方法調用拷貝構造函數兩次?
- 9. 一個拷貝構造函數調用
- 10. 拷貝構造函數不被調用?
- 11. 的拷貝構造函數
- 12. 混淆拷貝構造函數和私有成員
- 13. 沒有拷貝構造函數可用或拷貝構造函數被聲明爲'explicit'
- 14. 什麼時候在cpp中調用拷貝構造函數?
- 15. 基類的拷貝構造函數(C++)
- 16. 拷貝構造函數
- 17. 拷貝構造函數knowlege
- 18. 拷貝構造函數++
- 19. c#拷貝構造函數生成器
- 20. unique_ptr成員,私人拷貝構造函數與移動構造函數
- 21. 使用拷貝構造函數有什麼好處?
- 22. 用模板拷貝構造函數替換默認拷貝構造函數
- 23. 拷貝構造函數類C++
- 24. 模板類拷貝構造函數
- 25. 拷貝賦值爲未實現的拷貝構造函數
- 26. C++是什麼Derived默認拷貝構造函數初始化Base拷貝構造函數用?
- 27. 外部調用拷貝構造函數和析構函數
- 28. 拷貝構造函數不能識別繼承成員
- 29. C++特殊成員拷貝構造函數
- 30. 爲什麼拷貝構造函數choosen搬過來contrstructor
常見的情況,你_don't_希望成員在副本複製ctor是pimpl的成語。在那裏你想複製_implementation_,而不是_pointer_。理想情況下,任何_all_類成員都有有用的副本語義),而類本身不需要副本,或者任何類成員都不需要。在後一種情況下,您可以編寫自己的副本,並且默認情況下不會複製任何成員。 – MSalters 2010-03-31 12:50:53