【问题标题】:Why does overloaded assignment operator return reference to class?为什么重载赋值运算符返回对类的引用?
【发布时间】:2011-09-09 11:11:36
【问题描述】:
class item {
public:
    item& operator=(const item &rh) {
        ...
        ...
        return *this;
    }
};

下面的签名错了吗?

void operator=(const item &rh);

item a, b;
a = b; // equivalent to a.operator=(b); so there is no need to return this.

【问题讨论】:

    标签: c++


    【解决方案1】:

    这不是“错误”,而是令人惊讶。分配对目标对象求值。这就是内置的含义。如果您为自己的班级定义不同的内容,人们可能会感到困惑。

    例子:

    int c;
    while((c = getchar()) != EOF) {
      // ...
    }
    

    c 的赋值返回c 本身,然后将其与EOF 进行比较。用户会期望您的 item 类行为相似。

    【讨论】:

      【解决方案2】:

      带有 void 的签名不允许链式赋值:

      a = b = c;
      

      (查看 Johannes 的回答,了解基于赋值返回分配值的使用模式的另一个示例。)

      这就是不鼓励使用此类签名的原因。不过,如果我没记错的话,你其实可以使用这样的签名。

      【讨论】:

      • 最重要的是,这是内置类型所做的
      【解决方案3】:

      这是完全合法的。但是当你这样声明operator=时,你将无法进行“分配链”:

      item a(X);
      item b;
      item c;
      c = b = a;
      

      引用允许修改返回值。由于operator= 是从右到左评估的,所以我向您展示的用法是有效的。

      编辑 另外,正如其他人所提到的,返回值通常用于while (a = cin.get()) != 'q') 等表达式中。但是您也可以声明像A operator=(const A&)(返回副本)或const A& operator(const A&)(返回常量引用)这样的运算符。我的观点是:这个运算符可以返回 anything,但惯用的方法是返回对自身的非常量引用。

      【讨论】:

      • 不仅如此,将operator= 声明为返回void 您将无法将赋值结果用于任何表达式。
      猜你喜欢
      • 1970-01-01
      • 2012-02-22
      • 2015-05-31
      • 2017-07-09
      • 2017-03-01
      • 2013-05-26
      相关资源
      最近更新 更多