我遇到了一些以前从未见过的东西,正在努力理解它。
如果我有一个函数返回对某个对象的引用,那么当我调用该函数时,似乎可以将返回的引用分配给声明为对类型的引用的变量,或声明为类型本身的变量,而不会发生任何变化。
这里有一个基本的例子来演示我所说的:
int size = 150;
std::vector<int> v1(size);
void init(){
for(int i = 0; i < size; ++i){
v1[i] = i;
}
}
std::vector<int>& foo(){
return v1;
}
int main(){
init();
std::vector<int> v2 = foo();
std::vector<int>& v3 = foo();
for(int i = 0; i < size; ++i){
std::cout<<v2[i]<<" ";
}
std::cout<<"n";
for(int i = 0; i < size; ++i){
std::cout<<v3[i]<<" ";
}
std::cout<<"n";
return 0;
}
有人能向我解释一下v2
和v3
是如何被分配相同的功能的吗?
我很不好意思说,老实说,我本以为其中一个甚至不会编译。我已经注意到,更改v3
也会更改v1
的内容,但更改v2
对v1
没有任何作用,所以当一个比另一个更可取时,这对我来说是有意义的。然而,我很难调和这两项任务都有效的事实。
这是怎么回事?
std::vector<int> v2 = foo();
std::vector<int>& v3 = foo();
v2是v1(新存储器位置(的副本,而v3是v1(相同存储器位置(的参考
这意味着v1的地址(&v1(和v2的地址(amp;v2(不相同。然而;v1==&v3
因此,当对v2的元素进行更改时,v1将不会被更改。
但是,对v3的元素进行更改将更改v1。
为什么??因为他们都">点";到内存中的相同位置。