当我们重载operator =
(赋值)时,我想知道为什么我们应该返回一个引用。一方面,我所看到的(重载运算符=
)的大多数示例都返回了一个引用,但另一方面,我看到了几个(同一主题的)示例(&#) 39; t返回参考。
当我们需要返回引用(特别是在运算符=
重载中)时,有人可以解释一下,并举例说明吗?
答案 0 :(得分:5)
在operator=
中返回引用的主要原因是因为C ++ 03集合项的旧Assignable
属性,需要它。
C ++ 11中有相应的要求。
这些要求源于内置的operator=
,后者又从C获得,它支持分配链接,例如写
a = b = 666;
被解析为
a = (b = 666);
对于用户定义的operator=
效率较低,
通常更复杂(例如,对于迭代器实现)和
根据副作用打开了Unholy Practices™的大门,
等等很长一段时间,直到有人将我的注意力集中在标准库的要求上,我才将operator=
定义为返回void
。更高效,更简洁,不支持不良做法。但是有了这样一个要求 - 这是冰雪历史™的另一个不好的例子 - 一个人必须这么做。
答案 1 :(得分:2)
返回引用返回可修改的值(左值)。它允许以下内容:
(a = b) = c;
好吧,那个人有点傻,但这个更有道理:
++(a = b);
答案 2 :(得分:1)
一个原因是因为效率。通过在重载赋值运算符时传递和返回引用,可以防止大量构造函数和复制构造函数被调用。