我有一个类,它将创建一个非常大的数据,我不想被复制.对于所有考虑因素,对于我班级以外的任何人来说,它都是不可变的(只读).
这是一个概念代码,显示了我想如何实现它:
class C {
public:
C();
std::vector<int> const& get_vector() { return m_vector; }
private:
std::vector<int> m_vector;
};
C::C()
{
m_vector.push_back(1);
m_vector.push_back(2);
}
void DisplayVector(std::vector<int> const& new_v)
{
for (int i = 0; i<new_v.size(); i++)
std::cout << new_v[i] << std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
C myobj;
std::vector<int> v = myobj.get_vector();
v.push_back(3);
DisplayVector(v);
}
Run Code Online (Sandbox Code Playgroud)
当我单步执行此代码时,我会看到m_vector的给定内存地址及其数组的第一个元素(使用begin iterator).
当我从get_vector返回时,向量"v"及其第一个元素具有完全不同的内存地址.v.push_back(3)修改v没有任何问题(因为它看起来是副本)
当我调用DisplayVector时,它按预期工作,new_v地址与main v相同.
我究竟做错了什么?
您明确创建了一个副本
std::vector<int> v = myobj.get_vector();
Run Code Online (Sandbox Code Playgroud)
你可以修改,因为v是一个平原vector<int>.这里v有复制构造.
改为绑定引用(必须是const因为get_vector返回类型)使用
const std::vector<int>& v = myobj.get_vector();
Run Code Online (Sandbox Code Playgroud)
要不就
const auto& v = myobj.get_vector();
Run Code Online (Sandbox Code Playgroud)