引用
- 概念:引用不是新定义一个变量,而是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间
- 特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,再不能引用其它实体(引用具有常性)
-
int num = 10; int& ref = num; // ref是num的引用(别名)ref = 20; // 等价于num = 20; cout << num; // 输出20
-
const引用:用const修饰的引用,该引用变量不能修改,但变量可以修改
-
应用场景
-
实现简单,普通的取别名,比如:结构体套结构体,想要使用里层结构体的成员,不方便可直接用引用简化
-
做函数参数
-
想要通过形参修改外部实参
-
指针:指针虽然可以做到,但比较麻烦而且可能会出现指针非法操作异常
-
引用类型参数:如果不想通过形参改变实参时可以加const进行限制
-
-
自定义类型对象传参最好用引用可以提高传参效率
-
-
做返回值:注意不能返回栈上空间的引用
-
-
引用和指针的区别
-
概念上:引用就是一个别名,与实体共用一块内存地址空间
-
底层实现上:引用就是按照指针的方式实现的,即引用的底层就是一个指针,T& == T*const
-
区别主要体现再特性和使用形式上
-
引用在定义时必须初始化,而指针没有要求
-
引用在初始化时引用一个实体后就不能再引用其它实体,而指针可以在任何时候指向任意一个实体
-
没有空引用,但有空指针
-
在sizeof中含义不同:引用结果为引用类型大小,但指针始终是地址空间所占字节个数
-
引用变量的++,是直接给引用实体的值+1,而指针的++是让指针偏移一个类型大小
-
有多级指针但没有多级引用
-
访问实体的方式不同,指针需要显示解引用,引用编译器自己处理
-
引用比指针使用起来相对更安全
-
-
内联函数
- 概念:inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序的运行效率
- 特性
- inline是一种空间换时间的做法,省去调用函数的开销,所以代码很长或者有循环/递归的函数不适合使用作为内联函数
- inline对于编译器来说只是一个建议,编译器会自动优化,如果定义的函数体内有循环/递归等,编译器优化时就会忽略内联
- inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有函数地址了,链接就会找不到
- 内联函数和宏函数的区别
- 宏函数
- 优点:在编译处理阶段会展开,少了函数调用时的开销
- 缺陷
- 在预处理阶段展开,增加了预处理时间
- 编译之前已经展开,如果编译报错,不好定位
- 参数没有类型,而编译时已经展开,不能进行参数类型检测,安全性低
- 可读性较差
- 不能调试
- 因为已经展开,如果调用位置比较多,会引起代码膨胀
- 内联函数
- 优点
- 是一个函数,参数具有类型,可以进行类型检测,安全性高
- 在编译阶段展开,少了函数调用开销,提高代码运行效率
- 是函数,在调用时可以不让编译器展开,方便调试
- 没有副作用
- 缺点
- 可能引起代码膨胀
- inline是建议性关键字,编译器是否按照建议执行是不一定的,容易造成用户困扰
- 优点
- 宏函数