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

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

本文关键字:C++ 函数 对象 返回 引用 为什么      更新时间:2023-10-16

在Koenig和Moo的加速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;
}

它允许您编写流畅的界面,如下所示

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

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

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

cin >> a >> b;

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

它还允许您以C++惯用的方式循环和读入istream对象,例如

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

BLUF:是的。

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

您不需要这样做,但如果您通常只返回单个值,这将很有帮助。然后,您不必查阅每个调用的文档。按照惯例,你知道"我得到的东西表明了地位"。

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