目录
一.引用的概念
引用:为对象起的另外一个名字,引用类型引用另外一种类型
引用的本质是一个指针常量(指针的指向不能改变,指针指向的值可以改变)
引用的类型必须与其所引用对象的类型一致,但是有例外
下面我们来列举一些例子
int a = 10;
int& b = a; //b指向a(b就是a的另一个名字) 当b=20时,a=20
int& c; //错误,引用必须初始化
在定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用,一旦初始化完成引用将和它的初始值对象一直绑定在一起
因为无法令引用重新绑定到另外一个对象,因此引用必须初始化
二.引用即别名
定义了一个引用之后,对其进行的所有操作都是在与之绑定的对象上进行的
int a = 10;
int& b = a; //b指向a
b = 20; //这里b改为20,a也变成20
引用的本身不是一个对象,所以不能定义引用的引用
注意:引用的初始值,必须是一个对象
三.const的引用
可以把引用绑定到const对象上,就像绑定到其他对象上一样,称之为对常量的引用
与普通引用不同的是,对常量的引用不能被作用修改它所绑定的对象
const int a = 10;
const int& b = a; //引用的对象是常量
b = 20; //错误,b是对常量的引用,必能修改
int& c = a; //错误,非常量引用不能指向一个常量对象
类型保持一置的例外:
在初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可
int i = 10;
const int& r1 = i; //允许将const int& 绑定到一个普通int对象上
const int& r2 = 20; //正确,r2是一个常量引用
const int& r3 = r1 * 2; //正确,r3是一个常量引用
int& r4 = r1 * 2; //错误,r4是一个非常量引用
再来一个例子
//这样写法是正确的,但是r1精度缺失
double d = 3.14;
const int& r1 = d;
这个转换过程是,编译器产生了一个临时量,来进行类型转换
const int temp = d; //由双精度浮点数生成一个临时的整型常数
const int& r1 = temp; //r1绑定这个临时量
临时量:当编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名的对象