一、基本概念:
定义:引用就是为已存在的变量取了一个别名,引用和引用的对象共用一块内存空间。
用法:类型 &引用变量名 = 引用实体(此用法常用于函数传值,将实参赋给形参的时候,&取地址符)
二、引用的特点:
- 引用实体和引用类型必须为同种类型。
- 引用在定义时必须初始化并且不能被初始化为NULL;
- 不可以改变引用的关系。
三、引用的用法:
1. const与引用
被const修饰的变量其引用也要被const修饰
2. 参数与引用
引用作为函数参数时的原因:
- 在函数内部会对此此参数(引用的实体)进行修改——例如交换函数的实现(定义的变量实体的值被修改)
- 提高函数调用和运行效率——在函数传递时进行了对传入值进行拷贝(值传递)增加了空间和时间的占用,在创建新对象的时候构造函数中传入对象会也会走拷贝构造增加空间开销
函数在调用时,值的传递机制是通过“形参 = 实参”来对形参赋值达到传值的目的,产生了一个实参的副本(值传递)。而引用不用经过值的传递机制,转而直接对实参进行操作,因而没有了传值和生成副本的时间和空间消耗。
3. 返回值与引用
返回值为引用的好处:在内存中不产生被返回值的副本——如果返回值类型是一个类的对象利用引用返回则不会走拷贝构造节省时间和空间的销号。
//返回一个int类型的引用,则将传入的实参给形参赋值后(值传递会进行产生,返回的是形参本身则不在返回值处再走一个拷贝。
四、引用和指针的区别(重点):
- 引用在定义时必须被初始化并且不能被初始化为NULL,指针没有要求;
- 引用不能改变引用关系,而指针可以;
- 有多级指针,没有多级引用;
- 引用++和指针++表示的含义不同,指针自增是指针上的运算(比如是地址上的下一位),引用自增单纯+1;
- sizeof计算大小的结果不同,引用结果为类型大小,指针在32位内存下是四字节,在64位内存下是8字节;
- 指针是一个实体,需要分配内存空间;引用只是变量的别名,不需要分配空间
五、引用的优势:
使用指针作为函数的参数在被调用函数中同样要给形参分配存储单元,因此在这个层面上引用的效率更高,而且频繁使用指针会导致(*指针变量名)进行运算容易产生错误而且阅读性较差。