为什么赋值运算符要返回对象的引用?

我正在修改我的C ++,而且我正在处理操作符重载,特别是“=”(赋值)操作符。 我在网上查找,并且遇到了多个讨论它的主题。 在我自己的笔记中,我把所有的例子都取下来了

class Foo { public: int x; int y; void operator=(const Foo&); }; void Foo::operator=(const Foo &rhs) { x = rhs.x; y = rhs.y; } 

在我在网上find的所有参考资料中,我注意到操作符返回了一个对源对象的引用。 为什么正确的方式返回对象的引用而不是什么都没有?

通常的forms返回对目标对象的引用,以允许分配链接。 否则,这是不可能的:

 Foo a, b, c; // ... a = b = c; 

不过,请记住,让分配运算符变得比看起来更困难 。

返回types无关紧要,只需在如下语句中执行单个赋值即可:

 x = y; 

当你这样做的时候,它开始重要:

 if ((x = y)) { 

…当你这样做的时候真的很重要:

 x = y = z; 

这就是为什么你返回当前对象:允许具有正确关联性的链接分配。 这是一个很好的普遍做法。

你的赋值操作符应该总是做这件事情:

  1. 把一个const引用input(const MyClass &rhs)作为赋值的右边。 其原因应该是显而易见的,因为我们不想意外地改变这个价值; 我们只想改变左侧的内容。

  2. 总是返回一个引用到新修改的左侧, return *this 。 这是为了允许运算符链接,例如a = b = c;

  3. 总是检查自我分配(this == &rhs) 。 当你的类自己分配内存的时候,这一点尤其重要。

     MyClass& MyClass::operator=(const MyClass &rhs) { // Check for self-assignment! if (this == &rhs) // Same object? return *this; // Yes, so skip assignment, and just return *this. ... // Deallocate, allocate new space, copy values, etc... return *this; //Return self }