object.function()。function()。function().......这是如何工作的?

时间:2015-05-11 13:56:15

标签: c++

我在理解c ++语法的工作原理时遇到了问题。

#include<iostream>
using namespace std;

class Accumulator{
private:
    int value;
public:
    Accumulator(int value){this->value=value;}
    Accumulator& add(int n){value+=n;}
    int get(){return value;};
};

int main(int argc, char* argv[]){
    Accumulator acc(10);
    acc.add(5).add(6).add(7); //<-----how does this work?????
    cout<<acc.get();
    return 0;
}

这一行:acc.add(5).add(6).add(7); 它是从左到右还是从另一个方向工作 首先是acc.add(5),然后再添加(6) 我不明白。

结果应该是28。

提前感谢。

编辑: 很奇怪,这个代码编译成功,没有任何g ++错误。 我从一些非英语大学c ++教科书中得到了这段代码。英语不是我的第一语言。

第二次编辑:我现在在使用-Wall选项后得到所需的警告。

2 个答案:

答案 0 :(得分:8)

您的代码没有编译,但如果确实如此,它将从左到右工作。 Add会返回对Accumulator的引用(它在代码中没有返回值,但它应该返回*this)所以在您调用

之后
acc.add(5)

返回值是对acc的引用,您可以再次调用add

以下是添加了mult的修改示例,其中显示了操作顺序:

#include <iostream>
using namespace std;

class Accumulator{
private:
    int value;
public:
    Accumulator(int value){ this->value = value; }
    Accumulator& add(int n){ value += n; return *this; }
    Accumulator& mult(int n){ value *= n; return *this; }
    int get(){ return value; };
};

int main(int argc, char* argv[]){
    Accumulator acc(10);
    acc.add(5).add(6).mult(7);
    cout << acc.get();
    return 0;
}

如果从右到左,结果将是81,但它是从左到右,结果是147

答案 1 :(得分:4)

这称为Method chaining,常见于Fluent Interface模式。

每个方法调用(acc.add(5))都返回一个引用或指针,连续的方法调用(.add(7))可以在其上进行操作。