2010-03-31 47 views
2
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 
+0

常見的情況,你_don't_希望成員在副本複製ctor是pimpl的成語。在那裏你想複製_implementation_,而不是_pointer_。理想情況下,任何_all_類成員都有有用的副本語義),而類本身不需要副本,或者任何類成員都不需要。在後一種情況下,您可以編寫自己的副本,並且默認情況下不會複製任何成員。 – MSalters 2010-03-31 12:50:53

回答

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

相關問題