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
分配函数的返回值,首先使用复制构造函数创建临时值,然后调用赋值运算符进行值赋值。
我的问题是,当我的赋值运算符引用时,这个临时需要是什么。我找到了相关问题,但他们没有回答这个问题。
答案 0 :(得分:1)
test o3;
将导致对构造函数的调用以创建对象。 C ++不是Java,其中对象类型声明仅声明引用但不实例化对象。
test passByref_returnByVal(test& obj) {....}
导致复制构造函数调用,因为在其内部执行return obj;
时,编译器需要创建一个临时对象,因为该函数的返回类型为test
(而不是test&
或test*
)。
最后,因为o3
已经存在
test o3;
声明,调用赋值运算符以将passByref_returnByVal
的返回值分配给已存在的o3
。
因此,复制构造函数调用发生在passByref_returnByVal
,而不是operator=
。