1

次のコードの場合:

    #include<iostream>
    using namespace std;

    class Test
    {
    public:
       Test(const Test &t) { cout<<"Copy constructor called"<<endl;}
       Test()        { cout<<"Constructor called"<<endl;}
    };

    Test fun()
    {
        cout << "fun() Called\n";
        Test t;
        return t;
    }

    int main()
    {
        Test t1;
        Test t2 = fun();
        return 0;
    }

コピーコンストラクターがいつ呼び出されるかについて、私は本当に混乱していますか? 上記のプログラムを実行している場合と同様に、コピーコンストラクターは呼び出されません。つまり、コピー コンストラクターに渡されたパラメーターを台無しにしている場合 (const キーワードを削除している場合)、コンパイラ エラーは表示されません。しかし、そのショー

"'Test::Test(Test)' の呼び出しに一致する関数がありません"

さらに、 fun() は、 fun() の実行中に作成される te​​st 型のオブジェクトを返します。ここでコピーコンストラクターが呼び出されないのはなぜですか?

    int main()
    {
        fun();
        return 0;
    }

また、メイン関数に次の変更を加えている場合、コピーコンストラクターが2回ではなく1回だけ呼び出されるのはなぜですか?

    int main()
    {
        Test t2 = fun();
        Test t3 = t2;
        return 0;
    }
4

2 に答える 2

1

コードを VS2010 で実行すると、正しい結果が得られます。

1.

Constructor called
fun() Called
Constructor called
Copy constructor called

2.

fun() Called
Constructor called
Copy constructor called

3.

fun() Called
Constructor called
Copy constructor called
Copy constructor called

コピー コンストラクターが正しく呼び出されました。

于 2013-09-26T04:42:19.317 に答える