从C ++方法返回引用与副本

时间:2016-07-03 18:01:30

标签: c++ reference

我目前正在学习C ++,对于从方法返回引用的概念有点困惑。请考虑以下玩具示例:

3
3

这会将以下内容输出到标准输出:

d_values

由于我们返回对IntHolder的引用,因此返回的对象不应与h.values()实例中存储的对象相同,因此再次调用<input type="submit" id="add" value="Add" disabled><br/> <input type="submit" class="multiple" id="publish" name="publish" value="publish"><br/> <input type="submit" class="multiple" id="unpublish" name="unpublish" value="unpublish"><br/> <input type="submit" id="trash" class="multiple" name="trash" value="trash" disabled><br/> 时,我们应该看到5的大小?

由于情况并非如此,返回对象的引用或对象的副本有什么区别?从方法返回时有区别吗?

3 个答案:

答案 0 :(得分:3)

values函数返回引用,但您并未返回的对象分配给引用变量。相反,您正在制作副本,因为您要将其分配给名为std::vector<int>的新ret_val

您希望像这样修改代码,以便捕获返回的引用:

std::vector<int>& ret_val = h.values();

或者只是简单地说:

auto& ret_val = h.values();

答案 1 :(得分:1)

您的方法正在返回引用,但您将结果分配给另一个向量,从而生成副本。要解决此问题,请将ret_val定义更改为:

std::vector<int> & ret_val = h.values();

答案 2 :(得分:0)

如果返回引用,则返回相同的对象,而不是创建副本。基本上它似乎就像你期望的那样:

std::cout << h.values().size() << std::endl;
h.values().push_back(4);
h.values().push_back(5);
std::cout << h.values().size() << std::endl;

会返回

3
5

错误是另一个。我们来看看

std::vector<int> ret_val = h.values();

您发现ret_valh.d_values的副本,而h.values()正在返回对它的引用。我们可以按如下方式重写上面的代码:

std::vector<int> &ret_ref = h.values(); // object returned by `h.values()`
std::vector<int>  ret_val = ret_ref;

如果您致电ret_ref.push_back(4)h.d_values会发生变化。但ret_val是返回对象的副本,不会影响h.d_values