gpt4 book ai didi

c++ - 我的引用变量发生了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:15:11 25 4
gpt4 key购买 nike

我正在尝试掌握 C++ 中引用的窍门(我想我已经掌握了 Java 和 Javascript 中的引用,但转换比我想象的要难)。这是一段代码,我不明白其结果:

#include <iostream>
#include <vector>
int main()
{
std::vector<int> x;
x.push_back(1);

std::vector<int> y;
y.push_back(2);

std::vector<int>& r=x;
r.push_back(3);

std::vector<int>& s=r;
s.push_back(4);

s=y;
r.push_back(5);
s.push_back(6);

std::cout<<"x: ";
for(int i: x) {std::cout<< i<< " ";} std::cout<<"\n";

std::cout<<"y: ";
for(int i: y) {std::cout<< i<< " ";} std::cout<<"\n";

}

我得到以下输出(使用 g++ 4.9.2):

x: 2 5 6

y: 2

我不明白:元素 1、3、4 变成了什么?我本来希望 x 为 1,3,4,5,y 为 2,6。具有整数 vector 的事实会有所不同吗?

最佳答案

重要的一点:引用是不可重设的。一旦您初始化了一个引用,它将总是引用同一个对象。

现在让我们逐步分析您的代码:

std::vector<int> x;
x.push_back(1);

x是一个包含 1 的 vector .

std::vector<int> y;
y.push_back(2);

y是一个包含 2 的 vector .

std::vector<int>& r=x;
r.push_back(3);

r是对 x 的引用, 现在包含 1 3 .

std::vector<int>& s=r;
s.push_back(4);

s是对 x 的引用, 现在包含 1 3 4 .

s=y;

现在,您已经复制了 vector y到 vector x (通过引用 s 引用它)。这将替换 x 的内容内容为 y ,即 2 .

r.push_back(5);
s.push_back(6);

x (rs 都提到)现在包含 2 5 6 .

y在单push_back之后从未被修改过创建之后,它只包含 2 .


Java 中称为“引用”的概念实际上就是C++ 中的“指针”。使用指针,代码将如下所示:

std::vector<int>* r = &x;
r->push_back(3);

std::vector<int>* s = r;
s->push_back(4);

s = &y;

r->push_back(5);
s->push_back(6);

然后,x将包含 1 3 4 5 , 和 y将包含 2 6 .

请注意,创建指向对象的指针(获取对象的地址)的语法需要显式使用寻址运算符 & .同样,取消引用指针需要显式语法:*p用于简单地获取指向的对象,或 p->m用于访问成员(member) m p 指向的对象.

关于c++ - 我的引用变量发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32949186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com