我定义了一个像这样的类
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 ++作为我的编译器。 谁能告诉我为什么会发生这件事?
答案 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.