我试图在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";
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出(使用g ++ 4.9.2):
x:2 5 6
y:2
我不明白这一点:元素1,3,4的变化是什么?我原以为x为1,3,4,5,y为2,6.拥有整数向量的事实是否会产生影响?
重要的一点:参考不可重复.初始化引用后,它将始终引用同一对象.
现在让我们一步一步地分析你的代码:
std::vector<int> x;
x.push_back(1);
Run Code Online (Sandbox Code Playgroud)
x是一个包含的向量1.
std::vector<int> y;
y.push_back(2);
Run Code Online (Sandbox Code Playgroud)
y是一个包含的向量2.
std::vector<int>& r=x;
r.push_back(3);
Run Code Online (Sandbox Code Playgroud)
r是一个引用x,现在包含1 3.
std::vector<int>& s=r;
s.push_back(4);
Run Code Online (Sandbox Code Playgroud)
s是一个引用x,现在包含1 3 4.
s=y;
Run Code Online (Sandbox Code Playgroud)
现在,您已将向量复制y到向量x(通过引用s它的引用).替换的内容x一致的内容y,这是2.
r.push_back(5);
s.push_back(6);
Run Code Online (Sandbox Code Playgroud)
x(现在包含两者r和s参考)2 5 6.
ypush_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);
Run Code Online (Sandbox Code Playgroud)
然后,x将包含1 3 4 5,y并将包含2 6.
请注意,创建指向对象的指针(获取对象的地址)的语法需要显式使用address-of运算符&.同样,取消引用指针需要显式语法:*p用于简单地获取指向的对象,或p->m用于访问m指向的对象的成员p.