当我以不同方式定义对同一变量的引用时,结果会有所不同

时间:2014-01-28 04:53:22

标签: c++ c++11 reference g++

我定义了一个像这样的类

class A
{
public:
    A(int a, int b):a(a),b(b){}
    void test(const char* name) {cout<<name<<": "<<a<<"  "<<b<<endl;}
public:
    int a,b;
};

然后是主要功能:

int main()
{
    A obj(1,2);
    A& ref_1=obj;
    A& ref_2=obj;
    ref_1.a = 2;
    ref_1.test("ref_1");
    ref_2.test("ref_2");
    cout<<&obj<<endl<<&ref_1<<endl<<&ref_2<<endl;
    return 0;
}

结果,正如我所料,是

ref_1: 2  2
ref_2: 2  2
0x7fff59bb0c90
0x7fff59bb0c90
0x7fff59bb0c90

但是,当我定义两个这样的引用时:

    A& ref_1=obj, ref_2=obj;

结果很奇怪:

ref_1: 2  2
ref_2: 1  2
0x7fff58a68c90
0x7fff58a68c90
0x7fff58a68c80

我使用g ++作为我的编译器。 谁能告诉我为什么会发生这件事?

3 个答案:

答案 0 :(得分:4)

A& ref_1=obj, ref_2=obj;

相当于

A& ref_1=obj;
A ref_2=obj;

如果你想要两者都是引用,你需要写

A &ref_1=obj, &ref_2=obj;

或者,完全避免这种混淆,然后写下

A& ref_1=obj;
A& ref_2=obj;
和你原来一样。

答案 1 :(得分:2)

当你把它写成A& ref_1=obj, ref_2=obj;时,就好像你把它写成

一样
A& ref_1=obj;
A ref_2=obj;

如果你想在一行上写它并且两个都是引用,你需要把它写成

A &ref_1=obj, &ref_2=obj;

答案 2 :(得分:2)

你已经与优先权相悖了。

虽然你所写的内容读作“声明ref_1和ref_2为类型ref-to-A”,但&实际上绑定的变量不是类型。指针也会发生同样的事情。这就是为什么一直在争论哪个是更正确的方式来编写引用/指针。

A& ref_1; // ref_1 is a reference to type A.
A &ref_1; // means the same thing.

A& ref_1, ref_2;
A &ref_1, ref_2; // same as above.
A &ref_1, &ref_2; // what you thought the first line mean't

A* p1, p2; // p1 is a pointer, p2 is an instance of A
A *p1, *p2; // what you actually intended on the previous line.