一· 引用
概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。
注意:
1·引用必须初始化
2·一个变量可以有多个别名
3·一个引用一旦引用了一个实体就不能引用其他实体
例如
注释掉的两段一个用了引用,一个用了2级指针,两段代码含义相同
但注意不能用HP && hp代替HP ** hp
引用的实践主要用于引用传参或引用做返回值,减少拷贝,提高效率
函数在返回时会创建一个临时对象(它具有常性,不能够更改),创建int类型的函数接收的就是这个临时变量,而int&接收到的是他的引用,相当于跳过了临时对象那一步,返回的是它的引用,不具有常性,可以改变(这里是对栈的操做(一种数据结构),对象在堆上,不销毁可以使用)
这里a是一个局部变量,当返回时,a变量销毁,引用错误(有点像野指针)
二·const引用
可以引用const对象,但必须使用const引用
例如(下面是一个错误示范)
变量a是常属性的,不可更改的,而b作为a的别名,是int类型的,可以更改的,将权限进行了放大
应该改为const int& b;(注意权限不能放大,但可以缩小)
2·权限缩小
b的权限缩小了,但不影响a的权限,即a可改,但b不可以改(a++可以,b++不行)
const引用还可以给常量取别名
例如
const int& a = 30;
注意:当引用表达式时,表达式也是先存储在临时对象里的,即具有常性,所以给表达式取别名时应该用const引用
例如
int a = 8;
int b = 10;
const int& c = (a+b);
在这里我们要做一个区分
(1)
第一个是权限的放大(a只可读不可写,而取别名后ra可读可写,它们指向同一块空间,是经典的权限放大)
而第二个是值拷贝(将a的值赋给rd,将10拷贝给空间ra)
(2)
double b= 13.14;
int a = b;
int& c = b;(错误)
const int& c = b;(正确)
当类型的转换时,也会产生临时对象,引用时也是引用了他的临时对象,要用const引用
(过程,先将b的整数部分保存在临时对象里,再给临时对象起别名,而临时对象的生命周期就和引用相同了,即引用销毁时,临时对象才进行销毁)
const引用的主要用途:用于传参,比较宽泛(可传值,传临时对象,)
二·关键字inline
inline是为了解决函数不建立栈帧,提高效率,但是只适用于简单的函数而频繁调用的函数,复杂函数就算加了inline也不会展开(当代码的运行占很大一部分时间,而栈帧的建立所占时间就可以忽略不计,加上inline也不会减少运行时间)