@[TOC]
前言:
补充
临时变量
其实很多的运算比如:表达式,返回值,隐式类型转换等都会生成具有==常属性==的临时变量tmp
虽然有的简单的函数的函数栈帧在销毁会将值存在到寄存器eax中,但是寄存器非常小(4字节,8字节等),当存放的类型占用内存很大时,就不会存放到寄存器中,而是在当前调用函数那层栈帧中开辟一个==临时的变量==,用于存放返回值。
引用的概念
- 无论是程序还是计算机,最终操作的都是==内存单元==,而存储数据元素的变量实际上是
内存单元
别名。而对于同一个内存单元
,我们可以给它取==很多别名==,而这些别名就是那个内存单元。可以看出引用是不需要开辟空间的,没有必要。- 同样如果对一个变量名取==别名==---引用,那些==别名==就是
变量
,也就是内存单元的别名,那么对这些别名进行的运算结果是==直接影响==内存单元,也同样==影响==其它别名
引用的形式
起别名对象的类型+关键字&+别名=引用对象
引用的注意点
- 引用是不会开辟空间的,不占内存
- 引用在定义时==必须==初始化
- 同一变量的引用,只要其中一个对==内存单元==操作了,其影响就会映射到原变量---所有别名就是变量本身,在别名上的操作就是对变量的操作。
- 一个变量可以有多个引用
- 引用一旦引用的实体,就不能成为其它实体的引用。
常引用
权限
- 权限指的是对==内存单元==的
读或写
操作。- 权限放大:小权限的操作是进行大权限的操作,称为权限放大,这是不允许的。
- 权限缩小:大权限的操作进行小权限的操作是允许的。
引用的使用场景
做函数的形参
void swap(int& a, int& b)
{
int tmp = a;
a = b;
b = a;
}
做函数返回值
- 可以做函数返回值,但是要小心使用
比如
- 如果函数返回时,出了函数作用域,如果返回对象还未还给系统(静态变量,全局变量等),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回 .。
,
引用的优点
- 引用是不开辟空间的,这就在某些地方,可以提高程序运行效率。
- 而传值,会在函数栈帧期间为形参开辟空间,是有时间消耗的
引用与指针的区别
- 指针是一个变量,只是它的内存单元存放的是地址,通过这个地址我们可以操作它对应的内存单元,本质上和引用是不一样的。虽然有时候,
- 引用《高质量C++程序设计》:用适当的工具做恰如其分的工作。引用体现的是最小特权原则,即给予程序元素以完成功能的最小权限。而指针能够毫无约束的操作内存是非常危险的。
以下的总结理解就行,不需要特别记忆。
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型
实体- 没有NULL引用,但有NULL指针
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全