什么是引用
引用就是取别名
可以给一个变量取多个别名,也可以给别名取别名
别名与本名拥有同一地址,对任意别名修改,也会同时修改其他别名和本名
引用的作用
引用的作用与指针重叠度很高
图中函数的参数int& a,int& b,a是x的别名,b是y的别名
则ab的交换就是xy的交换
引用传参还可以减少函数调用的时间,提高函数调用的效率
引用的特性
1.引用在定义的时候必须初始化
2.一个变量可以有多个引用
3.引用一旦引用一个实体,就不能再引用其他实体
引用要避免权限的放大
不能这样,因为n再引用时放大了m的权限
这样是正确的
引用可以缩小权限
但是此时如果y++,则z++(只是不能通过z修改)
类型转换时会产生一个临时变量,
这里d会取出整形部分,并将其给临时变量,临时变量再赋给i
临时变量具有常性,相当于有const修饰
因此上图不行,应该为
计算也会产生临时变量
指针和引用的区别
.
但是引用和指针在底层上时一样的
内联函数
对于频繁调用的小函数,每次调用都需要建立一个栈帧,消耗过多
可以使用内联函数(inline)来提升程序效率
相当于直接将函数展开到调用的地方,而不是调用函数
因为大函数的展开会有很大的缺陷
导致编译出来的可执行程序变大
占用空间变大
同时内联不能有声明和定义的分离
因为调用函数需要"call"一个函数的地址,但是由于内联函数是直接展开的,相当于没有地址
因此链接时找不到函数
关键字auto
根据右边的数据自动对应类型
auto可以替代长类型的定义,简化代码
auto不能作为参数
auto也不能用来定义数组
auto遍历数组
C++中提供了一种新的遍历数组的方式
但是注意,该种遍历方式不能修改数组的值,因为e是一个临时变量而非数组内的值本身
想修改数组中的值需要加引用&
当然auto的位置其实是类型名
因此也可以换为其他类型
不过通常还是用auto较为方便
但是auto存在一定缺点,for循环迭代的范围必须是确定的, 对于数组就是首元素和尾元素,
当传入数组进入函数时无法使用
因为数组传参的本质是传入数组首元素的地址,而没有尾元素的地址
typeid
typeid可以看到数据的类型
空指针nullptr
这样定义存在缺陷
可以看到两个函数的调用都匹配到了第一个函数,因为宏替换后就没有区别了