看下面的代码:
#include <iostream>
using namespace std;
class Widet{
public:
Widet(int val = 0):value(val)
{
}
Widet& operator=(Widet &rhs)
{
value = rhs.value;
return *this;
}
int getValue()
{
return value;
}
private:
int value;
};
int main()
{
Widet obj1(1);
Widet obj2(2);
Widet obj3(0);
(obj3 = obj2) = obj1;
cout << "obj3 = " << obj3.getValue() << endl;
}
代码成功运行,输出为(使用VS2008):
当我让operator =返回值而不是引用时:
Widet operator=(Widet &rhs)
{
value = rhs.value;
return *this;
}
它也成功运行,输出为:
我的问题是:为什么第二个代码运行良好?难道我们不会收到错误消息吗?
为什么返回* this而不是* this是一个好习惯?
最佳答案
因为它是完全有效的代码。它返回对象的临时副本,并且允许您在临时对象上调用成员函数(包括operator=()
),因此没有错误。
如果对象不可复制,您将得到一个错误。
因为并非所有对象都是可复制的,有些对象的复制成本很高。您可以引用任何对象,并且引用总是很便宜。