为什么返回通过引用C ++中的函数传递的对象?

时间:2017-06-09 20:44:31

标签: c++ pass-by-reference

在第57页的Koenig和Moo的Accelerated C ++一书中,它们提供了如下所示的函数,它返回in。这样做的原因是指示尝试输入是否成功(第55页)。但是,in通过引用传递为函数的参数之一。那么你不能通过查看原始对象来获得istream的状态吗?

// read homework grades from an input stream into a `vector<double>'
istream& read_hw(istream& in, vector<double>& hw)
{
    if (in) {
        // get rid of previous contents
        hw.clear();

        // read homework grades
        double x;
        while (in >> x)
            hw.push_back(x);

        // clear the stream so that input will work for the next student
        in.clear();
    }
    return in;
}

2 个答案:

答案 0 :(得分:8)

它允许你编写流畅的界面,比如

read_hw(cin, hw).read_something_else(cin, x).blah_blah(cin, y)

因为每个方法调用都返回对istream对象的引用,所以它可以用于链接方法调用。

事实上,当你做

时会发生什么
cin >> a >> b;

每个operator>>函数调用都会返回对流的引用,因此可以对其进行链接。

它还允许您从istream对象idiomatic way in C++循环和读入,例如

while (read_hw(cin, hw)) { 
    do_something_with_hw(hw);
}

答案 1 :(得分:1)

BLUF:是的。

更长版本:通过返回in信号给实现者,他们传入的内容也是 out 参数。这是一个惯例。如果您的函数仅通过返回值进行通信,则可以在形式参数列表中区分您的输入。

您不需要这样做,但如果您通常只返回一个值,那么它会有所帮助。然后,您不必查阅每个电话的文档。按照惯例,你知道&#34;我得到的东西表明状态。&#34;

我的2c,这种做法很难映射到许多现实世界的编码示例,没有一致性,它不具有吸引力或有用。我一般不会使用它。作为一个相关的例子,Go和Lua代码都允许返回多个值。对于语言而言,能够将第一个返回值作为成功执行函数的结果更自然,第二个值是&#34; status&#34;结果。好的,坏的等等。