我的参考变量发生了什么?

tar*_*len 1 c++

我试图在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.拥有整数向量的事实是否会产生影响?

Rei*_*ica 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(现在包含两者rs参考)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.