我遇到了一些以前从未见过的东西,并试图理解它。
如果我有一个返回对某些内容的引用的函数,似乎当我调用该函数时,我可以将返回的引用分配给声明为类型引用的变量,或声明为类型本身的变量,一切都没有改变。
这是一个演示我正在谈论的内容的基本示例:
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 (&v2) 的地址不相同。 然而 &v1 == &v3
因此,当对 v2 的元素进行更改时,v1 不会发生更改。
但是,对 v3 的元素进行更改将会更改 v1。
为什么?因为它们都“指向”内存中的同一位置。
关于c++ - 分配返回非引用类型引用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64827712/