2012-02-18 19 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:

コピーコンストラクタ

呼ば

Cコンストラクタと呼ばれる

Bのコンストラクタと呼ばれるコンストラクタ

BのCONST呼ばコンストラクタ

呼ば

Cコンストラクタと呼ば

Bコンストラクタと呼ばれるコンストラクタ:ケース2

と呼ば

BコピーコンストラクタA、B、C、コンストラクタと呼ばれ、その後.. A、B、Cのコピーコンストラクタが呼び出さ:ructorマイ疑いがケース2 O/Pがなければならないということである

と呼ば

Cコピーコンストラクタ

が呼び出さ。しかし、それは起こっていません。助けてください。

+0

RVOについても読んでください。 – Nawaz

+0

@ serge:私はgetingしています、呼ばれたコンストラクタ、Bコンストラクタと呼ばれる、Cコピーコンストラクタが呼び出されました。 – Jatin

答えて

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);に等しく、一時的なものはありません。

関連する問題