C++ 引用
文章目录
1. 引用的基本使用
作用: 给变量起别名
语法: 数据类型 &别名 = 原名
注意:
- 别名的数据类型要和原名的相同;
- 别名和原名操作的是同一块空间
2.引用的注意事项
- 引用必须初始化
- 引用在初始化后,不可以改变
3.引用做函数参数
- 之前学到的函数参数时,一种是值传递,一种是地址传递。值传递中形参不可以修饰实参;地址传递则可以
- 引用做函数参数时,可以简化指针来修改实参。也就是说,函数传参时,可以利用引用的技术让形参修饰实参
1)值传递
形参不改变实参
2)地址传递
形参改变实参
3)引用传递
形参改变实参
形参会改变实参是因为,调用swap3时,传入的是主函数中实参a的别名,即swap3中的a,int& a = a
也就是说,swap3中的a是主函数中的a的别名,只是作为形参的形式,两个a操作的都是同一块空间,所以可以达到形参修改实参的效果,b同理。别名也可以和原名相同
相比于指针,省去了解引用,理解起来简单
4.引用做函数的返回值
引用可以作为函数的返回值存在的
注意:不要返回局部变量引用
用法:函数调用作为左值
1)红框中
我觉得这部分的原因和之前局部变量的地址不能返回堆区-new关键字是一个道理
test1子函数中返回的是局部变量a,在主函数中相当于创建了一个别名ref来接收a。
tese1子函数中a存在放在栈上,其内存被自动释放了,所以不能访问
2)蓝框中
此时用static把test2中局部变量a的生命周期变长,即变成静态变量,存在全局区,直到程序结束后才被释放内存
3)绿框中
左值就是等号左边的值,是变量;
此时test2()调用之后返回的是a,然后再a=45,相当于做了赋值操作“a = 45” ;
test2相当于是a的别名,然后通过赋值操作把45赋值给test2,也就是45赋值给a,操作的是同一块空间
4)注意
int& ref2 = test2();
这里的ref2是引用,test2是a的别名,ref2是test2的别名;
test2() = 45;
这里的test2是a的别名,test2()=45是赋值,相当于a=45
5.引用的本质
引用的本质在c++内部实现是一个指针常量
指针常量本质是指针,但指针的指向不可以更改,指针的值可以更改
打个比方,车牌号不能改,车里边的人可以换
int a = 56;
int& ref = a;
//这两句执行后,自动转换为 int* const ref = &a,由于使用了const来修饰,所以指针常量也就是引用的指向不可以更改
引用的注意事项说到引用初始化之后就不可以更改,也是因为使用了const来修饰了指针,变成指针常量
此时ref = a = 56
ref = 50;
再执行这一句,编译器识别到ref是引用,会自动解引用,*ref = 20
此时ref = a = 20
画图理解
用引用的时候直接使用,使用比指针方便,但要知道其本质是什么
6.常量引用
作用: 常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参
int a = 56;
//int& ref = 10;//不合法,引用必须使用一块合法的空间
const int& ref = 10;//这是合法的,此时引用引的是一块临时空间 加入const后 int temp = 10;const int& ref = temp;
//ref = 20;//加const后变为只读,不可以修改
int& ref = 10,是不合法的,引用必须使用一块合法的空间
加入const合法是因为编译器做了优化,int temp = 10;const int& ref = temp; 此时引用引的是一块临时空间,此时ref是只读,不可修改
如果代码量大的话,使用引用可能会出现形参误修改实参,为了防止这种情况,加入const修饰
黑马老师~