我正在修改我的C++,我正在处理操作符在一分钟内重载,特别是“=”(赋值)操作符。我在网上查找并且遇到了多个讨论它的主题。在我自己的笔记,我都记下来的东西我都喜欢的例子为什么赋值运算符会返回对该对象的引用?
在所有我在网上找到的引用,我注意到,操作返回到源对象的引用。 为什么正确的方式返回对象的引用而不是什么都没有?
我正在修改我的C++,我正在处理操作符在一分钟内重载,特别是“=”(赋值)操作符。我在网上查找并且遇到了多个讨论它的主题。在我自己的笔记,我都记下来的东西我都喜欢的例子为什么赋值运算符会返回对该对象的引用?
在所有我在网上找到的引用,我注意到,操作返回到源对象的引用。 为什么正确的方式返回对象的引用而不是什么都没有?
通常的形式会返回对目标对象的引用,以允许分配链接。否则,就不可能做到:
Foo a, b, c;
// ...
a = b = c;
但是,请记住,得到正确的分配新建分配FY操作is tougher than it might seem。
从来不知道复制和交换部分。我一直只是检查自我赋值,赋值,并返回void,我想这比我期待的更多。 接受你的答案指出复制和交换 感谢您的回应。 – maccard 2012-01-30 23:20:47
返回类型并不重要,当你只是在这样的语句执行单一任务:
x = y;
它开始无论何时你这样做:
if ((x = y)) {
。 ..和真正重要的,当你这样做:
x = y = z;
这就是为什么你返回当前对象:所有具有正确关联性的链式分配。这是一个很好的普遍做法。
你的赋值运算符应该总是做这些件事:
取一个const引用输入(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
}
检查自我分配是一个天真的解决方案,正确的是复制和交换。 – 2012-01-30 23:18:07
感谢您的回复,但我只是想通过忽略自我分配检查来做一个简单的例子。我明白了一切,因为他们回复了参考。 – maccard 2012-01-30 23:23:38
@MatteoItalia复制和交换可能会很昂贵。例如,如果使用复制和交换,将一个大向量分配给另一个大向量不能重用目标的内存。 – 2016-04-01 10:04:41
正确的方法是什么方式实现你想要的语义; _idiomatic_方法肯定是返回'T&'(在你的例子中为'Foo&')。 – ildjarn 2012-01-30 23:08:56
@MooingDuck,我想我错了。我假设我的笔记是错误的,但想知道为什么比这更正确。 – maccard 2012-01-30 23:12:08
[赋值运算符可能在C++中返回* this的引用](http://stackoverflow.com/questions/5669813/assignment-operator-return-a-reference-to-this-in-c);还有[返回*与赋值运算符](http://stackoverflow.com/questions/3248469/returning-this-with-an-assignment-operator) – 2012-01-30 23:26:15