从C++返回一个引用与一个拷贝 我目前正在学习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; }

从C++返回一个引用与一个拷贝 我目前正在学习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; },c++,reference,C++,Reference,既然我们返回对d_值的引用,那么返回的对象不应该与存储在IntHolder实例中的对象相同吗?因此,当再次调用h.values时,我们应该看到大小为5 既然不是这样,返回对对象的引用或对象的副本之间有什么区别?从方法返回时是否有差异?方法返回引用,但随后将结果分配给另一个向量,从而导致复制。要解决此问题,请将ret_val定义更改为: std::vector<int> & ret_val = h.values(); 您的方法返回一个引用,但随后将结果分配给另一个向量,从而导

既然我们返回对d_值的引用,那么返回的对象不应该与存储在IntHolder实例中的对象相同吗?因此,当再次调用h.values时,我们应该看到大小为5


既然不是这样,返回对对象的引用或对象的副本之间有什么区别?从方法返回时是否有差异?

方法返回引用,但随后将结果分配给另一个向量,从而导致复制。要解决此问题,请将ret_val定义更改为:

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

您的方法返回一个引用,但随后将结果分配给另一个向量,从而导致复制。要解决此问题,请将ret_val定义更改为:

std::vector<int> & ret_val = h.values();
您正在从values函数返回引用,但没有将返回的对象指定给引用变量。相反,您是在复制它,因为您正在将它分配给一个名为ret_val的新std::vector

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

std::vector<int>& ret_val = h.values();
您正在从values函数返回引用,但没有将返回的对象指定给引用变量。相反,您是在复制它,因为您正在将它分配给一个名为ret_val的新std::vector

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

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;
错台是另一个。让我们看看

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

如果调用ret_ref.push_back4,则h.d_值将发生变化。但是ret_val是返回对象的副本,不会影响h.d_值。

如果返回引用,则返回相同的对象,并且不创建副本。基本上,这就像你所期望的那样:

std::cout << h.values().size() << std::endl;
h.values().push_back(4);
h.values().push_back(5);
std::cout << h.values().size() << std::endl;
错台是另一个。让我们看看

std::vector<int> ret_val = h.values();
如果调用ret_ref.push_back4,则h.d_值将发生变化。但是ret_val是返回对象的副本,不会影响h.d_值