返回void或引用self?

时间:2016-06-11 10:52:28

标签: c++ reference void method-chaining

鉴于以下课程:

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

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

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

如果可以通过google-fu找到,或者这是一个非常基本的问题,我很抱歉,但我不确定究竟要搜索什么(而不是没有尝试)。

2 个答案:

答案 0 :(得分:4)

  

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

当调用

时,返回对实例的引用的函数可以链接
Object o;
o.addtoall(5).addtoall(6).addtoall(7);

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

答案 1 :(得分:3)

  

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

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

链接是什么?确切地说,返回此类引用的目的是允许:

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

append returns string&,毫不奇怪。虽然对于stringappend({c1, c2})更为简洁)略有用处,但在大多数其他情况下(例如您的,我们可以添加两个int而不是调用的情况下,这是毫无意义的)方法两次)。