2012-02-18 80 views
2

C++表示爲使用複合類的類創建複製構造函數,編譯器遞歸調用所有成員對象的複製構造函數。我想,在下面的代碼同樣的事情:複製成員對象的構造函數調用

class A 
{ 
public: 
    A(){cout<<"A constructor called"<<endl;} 
    A(const A&){cout<<"A copy constructor called"<<endl;} 
}; 

class B 
{ 
public: 
    B(){cout<<"B constructor called"<<endl;} 
    B(const B&){cout<<"B copy constructor called"<<endl;} 
}; 

class C 
{ 
    A a; 
    B b; 
public: 
    C(){cout<<"C constructor called"<<endl;} 
    C(const C&){cout<<"C copy constructor called"<<endl;}// If you comment this line, you will get output: Case 1 (see below)  and if you don't comment, you will get o/p: case 2(see below) 
}; 


void main() 
{ 
    C c; 
    cout<<endl; 
    C c2 = c; 
}` 

案例1:

稱爲構造

稱爲

ç構造稱爲

複製構造乙構造叫做

乙稱爲

案例拷貝構造2:

稱爲構造

稱爲

Ç構造稱爲B構造

稱爲

乙常量的構造方法ructor稱爲

稱爲C拷貝構造

我的疑問是,對殼體2的O/P應該是:A,B,C,構造稱爲然後.. A,B,稱爲C拷貝構造。但它沒有發生。請幫忙。

+0

閱讀關於RVO。 – Nawaz 2012-02-18 07:59:49

+0

@ serge:我正在創建一個叫做構造函數,叫做B構造函數,叫做C複製構造函數。 – Jatin 2012-02-18 08:01:08

回答

9

會發生,除非您提供了自己的C的拷貝構造函數,它告訴編譯器「不提供默認的拷貝構造函數」。

如果你希望你的拷貝構造函數做同樣的事情,隱含定義拷貝構造函數會做(與加印一起),你需要如下定義它:

C(const C& other) 
    : a(other.a), b(other.b) 
{ 
    std::cout << "C copy constructor called" << std::endl; 
} 
4

標準僅解釋默認拷貝構造函數的行爲。默認的拷貝構造函數是你使用,當你註釋掉你C.寫的拷貝構造函數如果你寫你自己的拷貝構造函數,您必須要複製,像這樣的任何成員明確地複製一個:

C(const C& c) : a(c.a), b(c.b) {cout<<"C copy constructor called"<<endl;} 

明顯地寫自己的拷貝構造函數有點容易出錯,所以最好儘可能地依賴默認的拷貝構造函數。

1

在這兩種情況下,都會調用C::C(C const &)拷貝構造函數。當它是隱式的時候,它調用基類的拷貝構造函數。當你明確定義它的方式時,它會調用AB的默認構造函數。這是預期的行爲。注意,C c2 = c;等於C c2(c);,沒有臨時表。