【问题标题】:Why return an object passed by reference to the function in C++?为什么返回通过引用传递给 C++ 中的函数的对象?
【发布时间】:2017-11-11 23:32:40
【问题描述】:

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

【问题讨论】:

  • 可以,但while (read_hw(s, data)) { ... }while (s) { read_hw(s, data); if (s) {...}} 好得多

标签: c++ pass-by-reference


【解决方案1】:

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

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

由于每个方法调用都返回一个对istream对象的引用,它可以用来链接方法调用。

事实上,当你这样做时会发生这种情况

cin >> a >> b;

每个operator&gt;&gt; 函数调用都会返回一个对流的引用,因此可以将其链接起来。

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

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

【讨论】:

    【解决方案2】:

    BLUF:是的。

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

    您不需要这样做,但如果您通常只返回一个值,这将很有帮助。这样您就不必每次调用都查阅文档。按照惯例,您知道“我得到的东西表明状态。”

    我的 2c,这种做法与许多现实世界的编码示例的映射很差,而且如果没有一致性,它就没有吸引力或有用。我一般不使用它。作为一个相关的例子,Go 和 Lua 代码都允许返回多个值。对于那些语言来说,更自然地能够让第一个返回值是函数成功执行的结果,而第二个值是结果的“状态”。好的,坏的等等。

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 1970-01-01
      • 2015-06-18
      • 2013-07-05
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多