引用
引用概念:变量的别名,操作引用,就是在直接操作引用对象
就像我们每个人有自己的本名也有自己的小名一样,引用就是变量的别名。
- 在语法层面:他就是变量的一个别名,没有独立空间,和其引用实体共用一个内存空间
写法:实体类型 & 引用名称=实体对象
引用的分类:可读可写的引用和常引用
常引用:引用指向的实体不能被修改。
引用的特性
- 引用于实例对象的类型要相同
- 引用必须初始化
- 一个引用只能有一个实例对象,一个实例对象可有多个引用
引用的应用场景:
- 做参数
- 做返回值
注意:返回值一定要大于函数本身的声明周期
在这段代码中c是一个局部变量,MyAdd()执行完之后c就被释放了,再执行点别的代码,c的这个地址会有别的变量来占有,result也就成为了别的变量。
引用的优点:在作为返回值、参数时,引用相比于传值效率非常高,因为传值要发生拷贝,而引用就是变量本身。
引用与指针的区别
为什么要将引用和指针来比较呢?引用使用起来和指针有很大区别,而且比指针简单。
这是因为引用在编译器底层实现层面是用指针来实现的。
引用是有自己的空间的,且就是变量的一个指针。在使用时编译器自动帮我们解引用所以就像在操作变量本身一样。我的理解是在编译器底层实现的层面 ra就相当于*pa
但是在语法层面是由很多区别的
- 引用在定义时必须初始化,而指针没有要求
- 引用在初始化一个实体之后,就不能引用其他实体,指针可以改变指向
- 没有NULL引用,但有NULL指针
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全