0
class test
{

public:

    int data;
    test(int var = 0):data(var){cout<<"constructor"<<endl;}
    ~test(){ cout<<"destructor"<<endl; }

    test(const test& var)
    {
        cout<<"copy constructor"<<endl;
        this->data = var.data;

    }
    test& operator=( const test& var)
    {
        cout<<"assignment op"<<endl;
        this->data = var.data;
        return *this;
    }

};


test passByref_returnByVal(test& obj)    
{    
    return obj;    
}


int main()
{

    test o1(5);
    test o2 = passByref_returnByVal(o1);
    cout<<"=========================="<<endl;
    test o3;
    o3 = passByref_returnByVal(o1);   
}

出力:

constructor

copy constructor

constructor

copy constructor

assignment op

destructor

与えられた例では、オブジェクトo2は一時オブジェクトを使用せずに直接コピー構築されます。

しかしo3、関数の戻り値を割り当てたい2番目のケースでは、最初にコピーコンストラクターを使用して一時が作成され、次に値の割り当てのために代入演算子が呼び出されます。

私の質問は、代入演算子が参照を取得するときに、この一時的な必要性が何であったかです。関連する質問を見つけましたが、回答がありませんでした。

4

1 に答える 1

1
test o3;

コンストラクターを呼び出してオブジェクトを作成します。C++ は、オブジェクト型宣言が参照を宣言するだけでオブジェクトをインスタンス化しない Java ではありません。

test passByref_returnByVal(test& obj) {....}

その関数の戻り値の型が( orではなく) であるため、その内部で行う場合return obj;、コンパイラは一時オブジェクトを作成する必要があるため、コピー コンストラクター呼び出しが発生します。testtest&test*

最後に、o3すでに存在するため、

test o3;

宣言では、代入演算子が呼び出されて、 の戻り値がpassByref_returnByVal既存のに代入されo3ます。

したがって、コピー コンストラクターの呼び出しは、passByref_returnByValではなく で発生していますoperator=

于 2012-06-27T01:24:37.670 に答える