1、引用概念
C++中 引用 的概念表示给当前的变量重新取一个名字(别名),但其表示的内存空间还是同一块。
引用符号为&
,最简单的引用如下:
int x = 10;
int& b = x;
b
作为变量x
所指向空间的另一个名字,与x
的地位是等同的,改变b
则x
的值也会改变。注意:引用类型和引用的实体必须是同种类的,跨种类不是不可以而是会出现问题(本文最后会介绍)
2、引用性质
引用有几个性质如下:
- 引用必须在定义时初始化。
- 一个变量可以有多个引用。
- 一个引用一旦在初始化时引用了一个实体(变量,给这个变量取别名),就不能再变化引用其他实体。
对于性质3有如下代码:
int a = 10;
int& b = a;
int c = 5;
b = c;
此时b
不再理解为是作为c
的引用,而是理解为将c
的赋值给b
;此时打印a
得到的结果也是5。
3、常引用使用方式及场景
1、对const
修饰的常变量的引用
错误方式:
const int a = 10;
int & b = a; //报错
正确方式:
const int a = 10;
const int & b = a;
2、对普通变量用常引用
int a = 10;
const int & b = a; //不报错
总结1和2,别名可以缩小读写权限但是不可以放大读写权限(原来我都不可以改你个别名还想能改? 我能改,但是你可以不能改!)
3、引用常数
const int& b = 10;
4、类型不同时的强制引用
错误引用:
double a = 12.2;
int& b = a; //会报错
正确引用:
double a = 12.2;
const int& b = a;
以上3和4就涉及一个比较重要的概念:以往我们以为赋值啥的就是直接把值给了对方,但是这里面涉及一个中间变量的操作
如图所示,涉及类型转换时,b
不是原来变量a
的别名,而是需要转换类型涉及的临时int型
的中加变量的别名,这个中间临时变量有常性,需要const
进行修饰。
其实在涉及类型转换,如int赋值给double,int与char类型比较等等都会涉及中间变量,之前所学的整形提升也是将需要提升的变量整形提升到一个中间变量再拿这个中间变量去比较或者运算而不是拿原来的那个变量来比较或者运算。
5、常引用在函数返回时的应用
#include "iostream"
int Add(int a, int b){
int c = a + b;
return c;
}
int main(){
int ret1 = Add(1,2); //不报错
int &ret2 = Add(1,2); //报错
const int & ret3 = Add(1,2); //不报错
return 0;
}
原因还是那个中间临时空间;因为返回时c
会被销毁,因为返回值会存在具有常性的中间临时空间中,因此要加const
修饰才能对其取别名。