为什么 return 一个对象通过引用传递给 C++ 中的函数?

Why return an object passed by reference to the function in C++?

在 Koenig 和 Moo 的 Accelerated C++ 一书中第 57 页,他们提供了如下所示的函数,returns 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;
}

布鲁夫:是的。

更长的版本:通过 returning in 它向实现者发出信号,表明他们传入的也是一个 out 参数。这是一个约定。如果您的函数仅通过 return 值进行通信,那么您可以在形式参数列表中区分您的输入。

您不需要这样做,但如果您通常只 return 单个值,这会很有帮助。这样您就不必每次调用都查阅文档。按照惯例,您知道 "the thing I get back indicates status."

我的 2c,这种做法很难映射到许多现实世界的编码示例,并且如果没有一致性,它就没有吸引力或用处。我一般不用。作为相关示例,Go 和 Lua 代码都允许 returning 多个值。对于那些语言,能够使第一个 returned 值成为函数成功执行的结果而第二个值成为结果的 "status" 更为自然。好的,坏的等等

它允许你编写流畅的界面,就像这样

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

由于每个方法调用 returns 都是对 istream 对象的引用,因此它可用于链接方法调用。

事实上,当你这样做时会发生什么

cin >> a >> b;

每个 operator>> 函数调用 returns 对流的引用,因此可以链接它。

它还可以让您循环读取 istream 对象 idiomatic way in C++,例如

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