2013-01-01 105 views
0
#include <iostream> 
#include <string.h> 

using namespace std; 

class withCC 
{ 
public: 
    withCC() {} 
    withCC(const withCC&) { 
     cout<<"withCC(withCC&)"<<endl; 
    } 
}; 

class woCC 
{ 
    enum {bsz = 100}; 
    char buf[bsz]; 
public: 
    woCC(const char* msg = 0) { 
     memset(buf, 0, bsz); 
     if(msg) strncpy(buf, msg, bsz); 
    } 
    void print(const char* msg = 0)const { 
     if(msg) cout<<msg<<":"; 
     cout<<buf<<endl; 
    } 
}; 

class composite 
{ 
    withCC WITHCC; 
    woCC WOCC; 
public: 
    composite() : WOCC("composite()") {} 
    void print(const char* msg = 0) { 
     cout<<"in composite:"<<endl; 
     WOCC.print(msg); 
    } 
}; 

int main() 
{ 
    composite c; 
    c.print("contents of c"); 
    cout<<"calling composite copy-constructor"<<endl; 
    composite c2 = c; 
    c2.print("contents of c2"); 
} 

運行結果低於:爲什麼這個複製構造函數在程序中被調用?

$ ./a.out 
in composite: 
contents of c:composite() 
calling composite copy-constructor 
withCC(withCC&) 
in composite: 
contents of c2:composite() 

而且我不明白爲什麼withCC(withCC&)是作爲輸出的一部分。我猜composite c2 = c;會導致執行復制構造函數。但是,如下所示,WITHCCclass composite的一部分,爲什麼它會被調用來處理這個拷貝構造函數?謝謝!

+4

構造? –

+1

@AshRj:我不認爲這是相當重複的:這裏用戶想知道複製構造函數w.r.t的行爲。組成,而不是繼承。 –

+0

@MFFooz我的錯誤。已移除鏈接。 – asheeshr

回答

7

複製構造函數withCC(withCC&)被調用,因爲composite的默認複製構造函數將調用其成員數據的所有複製構造函數。並且由於您有一個withCC對象作爲composite類中的成員數據,因此會調用複製構造函數withCC(withCC&)。當以往任何時候都按值傳遞的對象作爲參數傳遞給函數或

  • 回報

  • 2

    拷貝構造函數被調用

    • 當實例化一個對象,並從另一個對象或
    • 與值初始化它object by value from the function

    composite class的默認拷貝構造函數將調用其成員的拷貝構造函數,這就是爲什麼withCC(withCC&)正在打印。

    +1

    不,'Foo f2 = f;'不會調用'operator =',它會調用一個拷貝構造函數。它可能看起來像'=',但它實際上是建築。 – Yakk

    +0

    @Yakk我提到,當對象傳遞給一個函數時,複製構造函數被調用。在這種情況下,函數是= overloading函數 – Alfred

    +0

    'operator ='on'composite'對象永遠不會在原始海報的代碼中被調用。與'operator ='沒有交互發生,涉及'withCC(const withCC&)'。 – Yakk

    1

    陳述composite c2 = c; 將嘗試複製對象通過複製構造函數但類複合沒有用戶定義的複製構造函數因此編譯器的默認複製構造函數將用於您的情況。 而且要構造WOCC對象也創造複合因此對於WOCC建設用戶定義複製與CC因爲副本需要作出被調用

    相關問題