以前我对C++的引用了解到的是:
- 引用应在声明语句中初始化
- 一旦被定义,就无法重新定义引用
下面的代码可以在g++ 4.6.1
上完美运行,尽管它违反了#2:
int a = 10, b = 30;
int& x = a;
x = b;
你并没有重新定义引用,而是将值分配给了被引用的内存位置。打印a
,你会看到它将打印30
而不是10
;-)
更好地理解引用变量的方法是将其视为变量的名称。 int& x = a
意味着当您说x
时,实际上指的是a
。
将引用视为别名。
这很清楚:
int a = 10, b = 30;
不要把这看作是x = 10
,而应该看作是“x是a的另一个名称”。
int& x = a;
x
仍然引用a
,所以你会给a
赋值为b
(30)。x = b;
此时,x
仍然绑定到 a
,你只是改变了它的值。
因此,在这一点上,x == 30
并且 a == 30
,但如果你执行以下操作:
a = 10;
x
也将等于 10
。
该引用无法被重新安装,即无法引用不同的变量。
可以通过该引用修改变量。
引用的基本效果是它成为所引用值的另一个名称。
问题中的代码不会出错2
在你写下这一点时:
int& x = a;
x 变成了 a 的别名。
稍后你写道:
x = b;
它是一个常量变量,必须在声明语句中初始化,并且不能被重新定义。
第三个语句并不是你所认为的那样。它将b
的值赋给了x
,从而也赋给了a
。