我正在对我的C ++做一些修改,我正在处理运算符重载,特别是“=”(赋值)运算符。我在网上看到并且遇到了讨论它的多个主题。在我自己的笔记中,我把所有的例子都记下来像
class Foo
{
public:
int x;
int y;
void operator=(const Foo&);
};
void Foo::operator=(const Foo &rhs)
{
x = rhs.x;
y = rhs.y;
}
在我在网上找到的所有参考文献中,我注意到操作符返回对源对象的引用。 为什么是返回对象引用的正确方法而不是什么都没有?
答案 0 :(得分:18)
通常的表单返回对目标对象的引用以允许赋值链接。否则,将无法做到:
Foo a, b, c;
// ...
a = b = c;
尽管如此,请记住,让对方操作员is tougher than it might seem正确。
答案 1 :(得分:13)
当您在这样的语句中执行单个赋值时,返回类型无关紧要:
x = y;
当你这样做时,它开始变得很重要:
if ((x = y)) {
......当你这样做时真的很重要:
x = y = z;
这就是你返回当前对象的原因:允许链接具有正确关联性的赋值。这是一个很好的通用做法。
答案 2 :(得分:8)
您的分配操作员应始终执行以下三个事项:
将const-reference输入(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
}