【问题标题】:Return void or reference to self?返回 void 还是对 self 的引用?
【发布时间】:2016-06-11 10:52:27
【问题描述】:

给定以下类:

struct Object {
    int x, y;
    void addtoall( int value ){ x += value; y += value; };
    Object& addtoall( int value ){ x += value; y += value; return *this; };
};

这两个成员函数有什么区别?

我了解某些运算符重载(例如: operator+= )需要返回对 self 的引用,但不包括运算符重载,是否有必要?如果没有,您何时希望或需要返回对 self 的引用而不是返回 void?

如果这可以通过 google-fu 找到,或者是一个非常基本的问题,我深表歉意,但我不确定到底要搜索什么(并不是因为缺乏尝试)。

【问题讨论】:

  • 它允许方法链接,通常用作“流畅接口”的一部分。这些字词很容易通过 Google 搜索。
  • 啊!甚至没有想过要链接。
  • 在接受后人的答案之前,我会稍等片刻,但感谢你们如此迅速地回答并澄清了这一点。

标签: c++ reference void method-chaining


【解决方案1】:

这两个成员函数有什么区别?

返回实例引用的函数可以在调用时链接

Object o;
o.addtoall(5).addtoall(6).addtoall(7);

这是否有用取决于实际用例,但它通常用于开发所谓的领域特定语言语法。

【讨论】:

【解决方案2】:

我了解某些运算符重载(例如:operator+=)需要返回对 self 的引用

不,不是。许多人(包括我自己)主张应该将此类运算符声明为返回void,最值得注意的是operator=,它的链接(或表达式重用)实际上在绝大多数情况下会掩盖代码。我们这样做只是为了(不幸的)约定。

什么是链接?正是返回此类引用的目的是允许:

std::string{"asdf"}.append(c1).append(c2)

append returns string&,不出所料。虽然对string 稍微有用(append({c1, c2}) 更简洁),但在大多数其他情况下(例如您的情况,我们可以添加两个 ints 而不是调用该方法两次)毫无意义。

【讨论】:

  • +1 因为你的 不,不是 迫使我再次阅读标准。谢谢,从没想过,但这完全有道理。
猜你喜欢
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 2011-02-25
  • 2011-11-10
  • 2021-03-11
  • 1970-01-01
相关资源
最近更新 更多