我目前正在学习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的大小?
由于情况并非如此,返回对象的引用或对象的副本有什么区别?从方法返回时有区别吗?
答案 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_val
是h.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
。