想象我有一个这样的课程:
public:
A(const int a);
A& operator = (const A&);
};
为什么“ =”运算符的返回类型必须为“ A&”,而不仅仅是“ A”?
答案 0 :(得分:4)
返回类型不必为A&
;该标准只说:
用户声明的副本分配运算符
X::operator=
是类X
的非静态非模板成员函数,具有一个类型为X
,X&
的正好一个参数,const X&
,volatile X&
或const volatile X&
。
我们按照惯例这样做。
经常引用的论点是,您可以然后“链接”分配(a = b = c
),尽管说实话,这也不是常见的模式。在某种程度上,我认为这是对货物的狂热编程,但对任何人都没有伤害,并且保持一致性很好。
不利之处在于,大多数人甚至没有使用这种返回类型,有时它的实际原因可能会丢失(按照这个问题!)。
我们不返回A
,因为相反,按值返回操作对象的值(即返回_copy)会更没有用处,并且会混淆赋值运算符的目的,即是 not 来创建新的A
。
答案 1 :(得分:0)
所有这些构建都没有错误:
A& operator = (const A&);
A& operator = (A&);
A& operator = (const A&);
A& operator = (A);
A operator = (const A&);
const A& operator = (const A&);
void operator = (const A&);
复制赋值运算符是一个与任何其他函数一样的函数。您甚至可以在调用任何其他函数时显式调用它:
A test;
A testToBeCopied;
test.operator=(testToBeCopied);
您可以期待 const 与否,或者像任何其他函数一样调用带有或不带有 const 的复制赋值运算符函数。您不必期望 const 或 ref。你甚至可以返回 void。另一方面,通过引用传递或值传递来调用函数,是否期望签名中的常量取决于您的需要。方法链是需要返回 ref 的一个例子。您可以传递 ref 是因为效率和因为您不需要另一个新创建的对象。