我在理解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选项后得到所需的警告。
答案 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)
)可以在其上进行操作。