引用即为对象起的另外一个名字,通过声明符 & 来定义一个引用类型,定义了一个引用之后,对其的所有操作
都是在其绑定的对象上进行的。
引用必须和其绑定的对象类型相同(const修饰的常量引用例外,下面会详细说明)
使用方式: int num = 1; //变量定义
int &number = num; // number为num的引用
以下是错误使用方式:
int &ival; //错误:引用必须被初始化
int &ival = 10; //错误:引用类型的初始值必须是一个有地址的对象
int &r1 = ival; //错误:引用必须绑定到对象上,这里ival也是引用,本身只是别名,并不是一个对象,没有地址
常量引用
对常量的引用即把引用绑定到const对象上,常量引用相比普通引用,有以下特殊用法:
1)不能通过常量引用修改其绑定对象的值,但是不影响其绑定对象本身的修改操作
例: int i = 5; //定义常量i
const int &r = i; //定义常量引用r
r = 20; //错误:不能通过常量引用修改其绑定对象的值(i = 20 是可以的)
2)常量引用的类型不一定非要和其绑定的对象一致,只要该对象的值可以转换成常量引用对应的类型即可
例: double i = 1.2; //定义 int 变量 i
const int &r = i; //正确,可以将 const int & 类型引用绑定到 double 对象
这里的原理是,先将变量 i 转为 const int 类型,赋给一个临时变量temp,然后将引用 r 绑定到临时
变量上,所以引用 r 实际上并不是绑定在了 i 上。
int &r1 = i //错误 非常量引用必须绑定类型相同的对象
这个也很好理解,试想一下,类型不同时,r1实际是绑定在了一个临时对象上,而并非 i 上,这样就
不能通过 ri 来对 i 进行修改,而引用的目的一般就是希望通过引用来修改其绑定的对象,既然不能实
现修改,那这个绑定是没有任何意义的。