如果我有以下指向vector
的指针:
vector<int> *v = new vector<int>(10);
两者之间有什么区别
vector<int> &vr = *v;
和
vector<int> vr2 = *v;
根据我对参考文献的理解,对vr
和vr2
的更改不会影响v
。例如:
vr.at(0) = 5;
vr2[1] = 6;
// v[0] and v[1] would not change to 5 and 6 respectively.
那么vr
和vr2
之间的区别是什么?
答案 0 :(得分:4)
根据我对参考文献的理解,对vr和vr2的更改不会影响v。例如:
这是一个错误的理解。
vr
是对v
指向的对象的引用。对vr
所做的任何更改都会更改v
指向的对象的内容。
vr2
是副本。对vr2
所做的任何更改只会影响vr2
,而不会影响v
指向的对象。
答案 1 :(得分:1)
在第一个片段中
vector<int> &vr = *v;
您声明对指向v*
的向量的引用。 vr
和*v
上的操作现在将具有相同的结果-这就是引用的本质。在这里,但是
vector<int> vr2 = *v;
您通过副本分配创建了一个新的向量v2
。新向量在分配时拥有*v
持有的相同数据。现在它们是两个独立的对象,更改其中一个不会影响另一个。