C ++中赋值运算符的返回类型

时间:2020-11-07 20:42:27

标签: c++ operator-overloading assignment-operator

想象我有一个这样的课程:

public:
A(const int a);
A& operator = (const A&);
};

为什么“ =”运算符的返回类型必须为“ A&”,而不仅仅是“ A”?

2 个答案:

答案 0 :(得分:4)

返回类型不必A&;该标准只说:

用户声明的副本分配运算符X​::​operator=是类X的非静态非模板成员函数,具有一个类型为XX&的正好一个参数, 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 是因为效率和因为您不需要另一个新创建的对象。

相关问题