c++ - 分配返回非引用类型引用的函数

标签 c++ reference

我遇到了一些以前从未见过的东西,并试图理解它。

如果我有一个返回对某些内容的引用的函数,似乎当我调用该函数时,我可以将返回的引用分配给声明为类型引用的变量,或声明为类型本身的变量,一切都没有改变。

这是一个演示我正在谈论的内容的基本示例:

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;
}

有人可以向我解释一下为什么 v2v3 可以同时分配相同的函数吗?

我很尴尬地说,老实说我会认为其中一个甚至无法编译。我注意到更改 v3 也会更改 v1 的内容,但更改 v2v1 没有任何作用,因此,当其中一个比另一个更可取时,对我来说是有道理的。然而,我很难调和这两项作业都有效的事实。

这是怎么回事?

最佳答案

   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/

相关文章:

c++ - boost function + boost bind 复杂情况

python - 删除对对象的引用,但如果在其他地方引用,则将对象保留在内存中

c++ - 为什么对 vector 中类成员的引用指向不同对象的相同值?

javascript - Raphaeljs : How to get the elements reference back using event. 目标?

c# - 从 DLL 文件调用消息框函数时出现奇怪的字符?

c++ - 使用初始化列表的优点?

c++ - 写入数组时出现段错误

C++11 字符串容量和初始化

c++ - 谁能解释一下为什么两个 "results"不同?

c++ - 为什么可以重新设置引用参数?