[英]Returning a reference vs. a copy from a C++ method
我目前正在学习C ++,并且对从方法返回引用的概念有些困惑。 考虑以下玩具示例:
#include <iostream>
#include <vector>
class IntHolder {
private:
std::vector<int> d_values;
public:
IntHolder() {
d_values.push_back(1);
d_values.push_back(2);
d_values.push_back(3);
}
std::vector<int> &values() {
return d_values;
}
};
int main(int argc, char **argv) {
IntHolder h;
std::vector<int> ret_val = h.values();
std::cout << ret_val.size() << std::endl;
ret_val.push_back(4);
ret_val.push_back(5);
std::cout << h.values().size() << std::endl;
return 0;
}
这会将以下内容打印到标准输出:
3
3
由于我们返回的是对d_values
的引用,因此返回的对象不应该与IntHolder
实例中存储的对象相同,因此在再次调用h.values()
时,应该看到5的大小吗?
既然不是这种情况,那么返回对对象的引用或对象的副本有什么区别? 从方法返回时有什么区别吗?
您正在从values
函数返回一个引用,但没有将返回的对象分配给引用变量。 相反,您正在为其制作副本 ,因为您将其分配给名为ret_val
的新std::vector<int>
。
您想要像这样修改代码,以便捕获返回的引用:
std::vector<int>& ret_val = h.values();
或简单地:
auto& ret_val = h.values();
您的方法返回一个引用,但是您随后将结果分配给另一个向量,从而导致复制。 要解决此问题,请将您的ret_val
定义更改为:
std::vector<int> & ret_val = h.values();
如果返回引用,则返回相同的对象,而不是在创建副本。 基本上,这似乎与您期望的一样:
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.