int& a;声明
不可以。int& a;编译会直接报错(GCC 提示'a' declared as reference but not initialized)。
引用必须在声明时绑定到一个对象,而且绑定之后不能再改绑到别的对象。
正确的初始化方式
intx=10;int&a=x;// 最常见的写法int&b(x);// 直接初始化int&c{x};// 列表初始化(C++11)绑定规则
int&r1=10;// 错误:非 const 左值引用不能绑定字面量或临时对象constint&r2=10;// 正确:const 引用可以绑定临时对象int&&r3=10;// 正确:右值引用(C++11)
const int& r2 = 10;中,临时对象的生命周期会被延长到与r2相同。
引用不能改绑
intx=1,y=2;int&a=x;a=y;// 不是让 a 改去引用 y,而是把 y 的值赋给 x// 执行后 x == 2这是初学者很容易混淆的地方:对引用的赋值操作,作用的是被引用的对象,而不是引用本身。
可以先不写初始值的几种场合
以下场合看起来没有初始化,但其实只是绑定发生在别的地方,并不是真的未初始化。
1. 函数参数
voidf(int&a);// 调用时由实参完成绑定2. 类成员
引用类型的成员必须在构造函数的初始化列表中绑定(或者提供默认成员初始值),不能在构造函数体内赋值:
structS{int&ref;S(int&v):ref(v){}// 正确:在初始化列表中绑定};3.extern声明
externint&a;// 在其他编译单元中定义并初始化总结
| 写法 | 是否合法 | 说明 |
|---|---|---|
int& a; | 不 | 引用必须初始化 |
int& a = x; | 是 | 绑定到左值 |
int& a = 10; | 不 | 非 const 左值引用不能绑定字面量 |
const int& a = 10; | 是 | const 引用可绑定临时对象 |
int&& a = 10; | 是 | 右值引用(C++11) |
一句话记忆:引用 = 某个对象的别名,有了对象才能有别名,所以必须在声明时初始化,且终身不变。