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分配函数的返回值,首先使用复制构造函数创建一个临时值,然后调用赋值运算符进行值赋值。

我的问题是,当我的赋值运算符参考时,这个临时的需要是什么。我找到了相关的问题,但他们没有回答这个问题。

4

1 回答 1

1
test o3;

将导致调用构造函数来创建对象。C++ 不是 Java,其中对象类型声明仅声明引用但不实例化对象。

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

导致复制构造函数调用,因为当您在其中执行时return obj;,编译器需要创建一个临时对象,因为该函数的返回类型是test(而不是test&or test*)。

最后,因为o3已经存在

test o3;

声明时,调用赋值运算符将 的返回值赋给passByref_returnByVal已经存在的o3.

因此,复制构造函数调用发生在 中passByref_returnByVal,而不是在您的operator=.

于 2012-06-27T01:24:37.670 回答