首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >object.function().function().function().......这是怎么回事?

object.function().function().function().......这是怎么回事?
EN

Stack Overflow用户
提问于 2015-05-11 13:56:15
回答 2查看 885关注 0票数 2

我很难理解c++语法是如何工作的。

代码语言:javascript
复制
#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),然后加(6),我不明白。

结果应该是28。

提前谢谢。

编辑:奇怪的是,这段代码在g++上编译成功,没有任何错误。我是从一本非英语大学的c++课本上学到的。英语不是我的第一语言。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-11 13:59:50

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

代码语言:javascript
复制
acc.add(5)

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

下面是一个经过修改的示例,其中添加了mult,它显示了操作的顺序:

代码语言:javascript
复制
#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

票数 8
EN

Stack Overflow用户

发布于 2015-05-11 14:26:02

这被称为方法链,通常出现在Fluent接口模式中。

每个方法调用(acc.add(5))返回连续的方法调用(.add(7))可以操作的引用或指针。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30169596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档