目录
什么是引用?
引用是为已有的变量取一个别名,编译器不会为引用变量开辟内存空间,引用和他所引用的变量共用同一块内存空间。
如何为一个变量创建引用?
需要注意的是,引用类型和引用实体必须为同一种类型。
引用的特性:
1.引用在定义时必须有一个已经被初始化的对象:
2.一个变量可以被多个引用变量引用:
3.一个引用一旦引用一个实体,就不能再引用其他实体:
常引用:
当一个变量被const修饰时,这个变量就带上了常属性,当对一个带有常属性的变量引用时,需要加上const,否则会报错。
正确的写法为:
延申:
下面的引用为什么会报错?
原因:变量类型转换时,会产生一个临时变量来存储要转换的值,这个临时变量具有常属性。由于引用的使用权限只包括平移和缩小,不能放大。因此,在类型转换并引用时,需要加上const。
权限——放大:
对a的引用b需要加上const限制权限;如果不加const,b就变为了变量,也就可以修改了,属于是权限的放大了。
权限——缩小:
变量a,对他的引用可以加上const,加上以后属于权限的缩小,不会报错。
引用的使用场景:
引用传参:
在c语言中,有两种传参方式:传值,传地址。
传值简单,但是不能修改原变量的值;
传地址可以修改原变量的值,但是容易写错。
在cpp中,定义函数时,使用引用作为形参,可以达到传值传参即可改变变量值的目的。
解析:
使用引用接收参数,相当于为原变量创建了一个别名,对别名的操作会映射到原变量上。
引用返回:
引用返回,返回的是返回值的别名,因此,可以对返回值直接操作。
前提:
使用引用返回,要保证函数返回值所在的空间,出了函数的作用域依然存在,不会立刻销毁。如果会被销毁,就不能使用引用返回,而要使用传值返回。
优点:
引用返回比传值返回具有更高的效率。
对比:
引用返回,在底层实质上是按照指针的方式实现的。
我们知道指针传参和值传参,以及指针返回和值返回在效率上差异较大。指针传递明显优于值传递。因此引用返回优于传值返回。
引用和指针的比较:
1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体
4. 没有NULL引用,但有NULL指针
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)
6. 引用自加,使引用实体的值加1,指针自加是指针向后偏移一个类型的长度。
7. 有多级指针,但是没有多级引用。
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
9. 引用比指针使用起来相对更安全