0

以下の例を検討してください。

#include <iostream>

using namespace std;

class Test{

public:
    int a;
    Test(int a=0):a(a){ cout << "Ctor " << a << endl;}
    Test(const Test& A):a(A.a){ cout << "Cpy Ctor " << a << endl;}
    Test operator+ ( Test A){
    Test temp;
    temp.a=this->a + A.a;
    return temp;
    }
};

int main()
{
Test b(10);
Test a = b ;
cout << a.a << endl;
return 0;
}

出力は次のとおりです。

$ ./Test
Ctor 10
Cpy Ctor 10
10

Copy コンストラクターを呼び出します。ここで、コードを次のように変更するとします。

int main()
{
Test b(10);
Test a = b + Test(5);
cout << a.a << endl;
return 0;
}

出力は次のようになります。

$ ./Test
Ctor 10
Ctor 5
Ctor 0
15

Test a = b + Test(5);はコピー コンストラクターを呼び出しません。typeb+ Test(5)の新しいオブジェクトをインスタンス化するために使用する必要があると私が考えたので、これはコピーコンストラクターを呼び出す必要があります。誰かが出力を説明できますか?aTest

ありがとう

4

1 に答える 1

2

コピー省略を参照してください: http://en.wikipedia.org/wiki/Copy_elision

基本的に、temp は構築されず、結果は Test a オブジェクトに直接入れられます。

于 2013-07-09T11:37:49.983 に答える