-1

今まで考えたこともなかった質問に出くわしました。ここにあります:各オブジェクト(初期化リストにリストされている)の「コンストラクター」がトリガーされます。

class B
{
    public:
        B() { cout<<"B Con\n";}
        B(const B &b) { cout<<"B Copy Con\n";}
};

class A
{
    public:
        A(B &b):_m(b) { cout<<"A Con\n";}
        A(const A &a):_m(a._m) { cout<<"A Copy Con\n";}
    private:
        B _m;
}

main()
{
    B b;
    A a(b);
}

次に、次のような出力を得ました。

B Con
B Copy Con
A Con

出力によると、「A a(b)」が B のコピー コンストラクターをトリガーしたと思います。私が正しければ、それは 'A(B &b):_m(b)' が B のコピー コンストラクターをトリガーすることを意味します。なぜコンストラクタではなくコピーコンストラクタなのですか?

4

4 に答える 4

1

理由は、あなたが電話するときです。

_m( whatever )

次に、コピー コンストラクター

B(const B &b)

パラメータリストに一致する唯一のものです。1 つのパラメーターを渡すと、そのパラメーターの型はclass B.

コピー コンストラクターは特別なものではありません。パラメーター リストが一致すると、初期化リストを介して呼び出される単なるパラメーター化されたコンストラクターです。

于 2011-08-23T11:53:03.610 に答える
1

コンパイラに で初期化するように指示しているので_mbコピー コンストラクターを呼び出さないのはなぜでしょうか。

于 2011-08-23T11:54:12.520 に答える
1

答えは A(B &b):_m(b)、コピー コンストラクターで B _m をインスタンス化しているところにあります。

代わりにそう A(B &b):_m()すると、デフォルトのコンストラクターが使用されます。

于 2011-08-23T12:04:24.507 に答える
0
A(B &b):_m(b) { cout<<"A Con\n";}

ここでは、 B のコピー コンストラクターであるの_m(b)呼び出しが発生します。そのため、初期化時B(const B&)に最初に出力し、次に A のコンストラクタ本体に入り、 を出力します。それがすべてを説明しています。B Copy Con_mA Con

于 2011-08-23T11:52:58.607 に答える