关于赋值运算符是如何工作的,有一些我不明白的地方,请看这段代码:
#include <iostream>
using namespace std;
class foo
{
int val{};
public:
foo()
{
}
foo( int n )
{
val = n;
cout<<"Constructor"<<endl;
}
foo( const foo& f )
{
cout<<"Copy constructor, val "<<endl;
val = f.val;
}
foo( const foo&& f )
{
cout<<"Copy constructor -rvalue-"<<endl;
val = f.val;
}
foo operator+( const foo& other ) const
{
cout<<"Sum "<<endl;
foo foo2;
foo2.val = val + other.val;
return foo2;
}
foo& operator=( const foo& f )
{
cout<<"Assignment operator\n";
val = f.val;
return *this;
}
foo& operator=( const foo&& f)
{
cout<<"Assignment operator, r-value\n";
val = f.val;
return *this;
}
~foo() {}
};
int main()
{
foo a{1}, b{5}, c{4};
foo d;
d = a + b + c;
foo d2 = a + b + c;
return 0;
}此应用程序的输出为:
Constructor
Constructor
Constructor
Sum
Sum
Assignment operator, r-value
Sum
Sum我不清楚的是为什么第二个赋值没有触发赋值运算符。第一个赋值是在一个通过默认构造构造的对象上,然后一个普通的赋值操作是可见的,在第二个赋值操作中,临时对象应该由编译器构建,然后赋值给d2,但是从任何提供的赋值操作符都看不到打印。为什么?
谢谢
发布于 2013-11-18 03:45:36
没有第二个赋值,你的代码只有一个赋值。这条线
foo d2 = a + b + c;是复制初始化。
发布于 2013-11-18 03:45:21
为了提高效率,请执行以下操作:
foo d2 = a + b + c;(以及T是具有非显式复制构造函数的类型的任何T n = expr )实际上与
foo d2(foo(a + b + c)); // can be optimized to foo d2(a + b + c)不是
foo d2;
d2 = a + b + c;这就是为什么你在输出中只看到一个赋值的原因。
你可以这样想:当变量已经存在时,它就是赋值。当你创建一个新的变量时,它是一个构造函数调用。
发布于 2013-11-18 03:45:28
您初始化的是d2,而不是赋值给它,所以赋值操作符不会被调用。
https://stackoverflow.com/questions/20035242
复制相似问题