EffectiveC++条款10里说:令operator=返回一个reference to this,就是说对赋值运算符重载时,最好返回this的引用,返回*this很好理解,返回引用一方面是为了提高效率,减少了拷贝的过程,另一方面书上说的是为了实现连锁赋值,也就是:
x = y = z = 15;
的形式,真的是这样的吗,我写了个程序测试一下
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Name
{
public:
Name() = default;
Name(string s) : name(s) {}
void setName(string s)
{
name = s;
}
void print()
{
cout << name << endl;
}
Name operator=(const Name& rhs) //直接返回对象
{
this->name = rhs.name;
return *this;
}
private:
string name = "Empty";
};
int main()
{
Name obj1;
Name obj2("liurui");
Name obj3;
obj3 = obj1 = obj2;
obj1.print();
obj2.print();
obj3.print();
return 0;
}
程序的输出结果是:
可以看到程序直接返回对象,也实现了连锁赋值,实际上赋值符号满足右结合律,上述连锁赋值实际上是:
x = (y = (z = 15));
所以返回对象或者引用都可以实现连锁赋值,但如果要实现如下的赋值:
(x = y)= z;
就必须返回引用才能实现。
总之,返回reference to *this总没有错。