引用是CPP基于C语言的基础上提出的一个新的概念。本篇博客将和大家一起学习什么是引用,扒一扒引用的一些小细节,希望看完本篇博客后对你有所帮助。
一、引用的概念
引用不是定义一个新的变量,而是给已存在的变量取了一个别名,在语法上编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
简单的说,引用就是给一个已存在的变量取一个别名。
比如,我们称某知名练习生为坤哥,鸡哥,只因哥,这些别名都指的是这个练习生。
类型& 引用变量名(对象名) = 引用实体;
void TestRef()
{
int a = 10;
int& ra = a;
int& x = a;
int& y = a;
printf("%p\n", &a);
printf("%p\n", &ra);
printf("%p\n", &x);
printf("%p\n", &y);
}
注意:引用类型必须和引用实体是同种类型的。
引用的特性:
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
int main() { int a = 10; int& ra = a; int& x = a; int& y = a; return 0; }
3. 引用一旦引用一个实体,再不能引用其他实体
二、引用的使用场景
2.1. 引用做函数形参
| 例 |
void Swap(const int& x, const int& y) // x是实参a的别名,y是实参b的别名
{
int tmp = x; // 在函数中,x和y交换,main函数中的a和b也完成了交换
x = y;
y = tmp;
}
int main()
{
int a = 1;
int b = 2;
Swap(a, b);
printf("%d %d\n", a, b);
return 0;
}
① 做输出型参数,在函数中修改形参,实参也修改了
② 减少拷贝,提高效率 (在传值传参中,形参是实参的一份临时拷贝,用引用做函数的形参,可以省去拷贝实参这一步,从而提高程序的效率)
2.2. 引用做返回值
| 传值返回 |
| 引用返回 |
由于引用返回的特性。如果Count函数中的n没有static修饰,此时系统为n在栈上开辟内存空间,当Count函数调用结束后,n的空间会还给操作系统。因为函数返回值的类型是引用类型,返回的是n的别名,通过返回的别名可以访问到系统先前为n开辟的那一块内存空间,但这块内存空间已经还给系统了,所以这样的访问是不安全的。
通过以上对引用类型的特性分析,我们可以得出一下结论:
● 如果出了函数作用域,返回的变量不存在了,则不能使用引用返回。因为引用返回的结果是未定义的。
● 如果出了函数作用域,返回的变量存在,则能使用引用返回。
| 附 |
一块内存空间的销毁意味着什么?
① 这块内存空间还存在吗?
● 存在,只是没有了该内存空间的使用权,先前存储在该内存空间中的数据不被保护了。
② 我们还能够访问这块内存空间吗?
● 能,只是我们读取的数据是不确定的。(再次访问该内存空间时,得到的数据可能是先前存放的数值,可能是随机值,也可能是被其他有意义的值所覆盖)
三、const修饰的引用类型
在学习const修饰的引用类型前,我们要先了解一条权限规则:在指针和引用的赋值中,权限可以被缩小,但是不能被放大。
当函数中的形参是引用类型时,如果要缺省参数,则引用类型的参数要用const修饰。
四、引用和指针的区别
在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。
通过上面两句话好像并不能判断,这样说是否合理,还是要通过具体的实例来说明。
通过观察以上引用和指针的汇编代码对比,可以发现二者的汇编代码是一致的,由此可得出在底层实现上,引用是使用指针来实现的。
引用和指针的不同点:
1. 引用在概念上是定义一个变量的别名,而指针则用来存储一个变量地址。
2. 引用在定义时必须初始化,指针则没有要求。
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型的实体。
4. 没有NULL引用,但有NULL指针。
5. 在sizeof中含义不同:sizeof(引用) 的结果为引用类型的大小,但 sizeof(指针) 则始终是地址空间所占字节个数。(32 位平台下占4个字节)
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
7. 有多级指针,但是没有多级引用。
8. 访问实体方式不同,指针需要显式解引用,而引用类型编译器会自己处理。
9. 引用使用起来相对指针更安全。(使用指针可能会出现访问空指针和对野指针操作的问题,而引用则不存在此类问题)
本次与大家一起学习CPP中关于引用的内容到这就已经接近尾声了,期待下次与你相遇。
< 你的关注,点赞,评论,收藏都是对我创作最大的鼓励 >
( 若本篇博客存在错误,望指出,感谢! )