为什么 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);
}
在 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);
}