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;copy-constructor が実行されると思います。しかし、以下に示すようにWITHCCの一部ですがclass composite、なぜこのコピー コンストラクターを処理するために呼び出されるのでしょうか? ありがとう!

4

3 に答える 3

7

withCC(withCC&)の既定のコピー コンストラクcompositeターがそのメンバー データのすべてのコピー コンストラクターを呼び出すため、コピー コンストラクターが呼び出されました。そしてwithCC、クラスのメンバ データとしてオブジェクトがあるためcomposite、コピー コンストラクタwithCC(withCC&)が呼び出されます。

于 2013-01-01T15:21:39.277 に答える
2

コピーコンストラクターが呼び出されます

  • 1 つのオブジェクトをインスタンス化し、それを別のオブジェクトの値で初期化する場合、または
  • 関数への引数として値でオブジェクトを渡すときはいつでも
  • 関数から値でオブジェクトを返す

クラスのデフォルトのコピー コンストラクcompositeターは、そのメンバーのコピー コンストラクターを呼び出すため、withCC(withCC&)出力されます。

于 2013-01-01T15:22:26.173 に答える
1

ステートメント複合 c2 = c; コピーコンストラクター を介してオブジェクトをコピーしようとしますが、クラスコンポジットにはユーザー定義のコピーコンストラクターがないため、コンパイラーのデフォルトのコピーコンストラクターが使用されます。そして、複合体の作成でもWOCCオブジェクトを構築したいので、WOCC構築のために、cc を使用してのユーザー定義のコピーコンストラクターが呼び出されます

于 2013-01-01T15:35:05.613 に答える