为什么赋值运算符要返回对象的引用?
我正在修改我的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;
这就是为什么你返回当前对象:允许具有正确关联性的链接分配。 这是一个很好的普遍做法。
你的赋值操作符应该总是做这三件事情:
-
把一个const引用input
(const MyClass &rhs)
作为赋值的右边。 其原因应该是显而易见的,因为我们不想意外地改变这个价值; 我们只想改变左侧的内容。 -
总是返回一个引用到新修改的左侧,
return *this
。 这是为了允许运算符链接,例如a = b = c;
。 -
总是检查自我分配
(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 }