在c ++函数中返回引用

时间:2018-04-06 18:13:21

标签: c++ reference

尽管我认为我理解参考文献,但我不知道这两篇文章是否存在差异(两者都有效):

(includes and that stuff)

//doesn't return a reference to a vector
vector<int> ref_to_vec1(vector<int>& vec) {
  vec.push_back(whatever);
  return vec;
}

//returns a REFERENCE to a vector
vector<int>& ref_to_vec2(vector<int>& vec) {
  vec.push_back(whatever);
  return vec;
}

vector<int> v;

//Both append whatever to v
ref_to_vec1(v);
ref_to_vec2(v);

使用函数返回引用有什么意义?

在这种情况下,返回任何东西的重点是什么?你只需要用向量调用函数,而不需要为函数的结果赋值。

谢谢!

4 个答案:

答案 0 :(得分:3)

  

在这种情况下,返回任何东西的重点是什么?您   只需要使用向量调用函数,而无需分配   任何与函数结果有关的东西。

无。可能是bool表示失败或成功(它是WinAPI的作用)但除此之外如果您在参数列表中使用了要填充的引用而不是使用函数的返回值然后你根本不需要退货。

返回引用的目的是避免复制要返回的对象。 ref_to_vec1()复制*在您返回时传递给它的vec并保存返回值:

auto v2 = ref_to_vec1(v); // v2 is a copy of v, changing v2 doesn't change v
auto& v3 = ref_to_vec2(v); // v3 is a reference to v, any changes made to v3 are made to v too.

*除非它被(N)RVO优化或移动(C ++ 11或更高)。

答案 1 :(得分:2)

案例1显而易见,如米哈伊尔所解释

案例2你的函数创建一个新对象并返回对它的引用,或者访问已经实例化的东西;像一个单身人士

案例3:您希望链接运营商,通常是流媒体运营商; myStream&lt;&lt; firstVal&lt;&lt; secondVal;

我很确定这个问题是重复的,并且必须已经在这个网站上有很好的答案

答案 2 :(得分:0)

如果您不使用引用,则会有第二个向量对象,它从函数返回。

答案 3 :(得分:0)

我认为,混淆的一部分是概念上有两组函数 - 以某种方式处理参数并返回结果的函数,以及作用于参数的函数。有些语言甚至在语言中都有这种区别 - 例如,在Pascal中你有'过程'和'功能'。前者不能归还任何东西,而后者必须归还。

你所拥有的是一个程序性的东西 - 它在论证中起作用,在你的情况下,添加一个元素。它通常不需要返回任何内容(vector::push_back()永远不会失败)。