一,内联函数
1,概念
用inline修饰的函数叫做内联函数。
编译时,内联函数会被c++编译器用函数体替换函数的调用,没有函数压栈的开销,提升程序运行的效率。
内联函数一般应用在一些短小但是调用频繁的函数。
2,内联函数的特性
1>是一种用空间换时间的做法,当代码段过于长或者有循环 / 递归的函数不适合作为内联函数。
2>inline对于编译器而言只是一种建议。如果定义为inline的函数体内有递归或者函数内部的代码较长,编译器优化时会忽略掉内联。
3>内联函数不可以声明和定义分离。当inline展开时,就不存在函数地址了,分离会导致连接错误,使链接找不到。
3,内联函数和宏的比较
C语言中,宏函数也可以实现inline的功能。
宏有以下的优缺点:
优点:复用性强,提高效率,减少站帧的创建
缺点:可读性差,不方便调试,无类型安全的检查
由于inline几乎解决了宏函数缺点的同时兼具宏函数的优点,所以我们在C++之中不再建议使用宏,而是建议使用const,enum,inline替代宏。
二,auto关键字
1,auto的说明
auto的使用目的是让编译器自动推导变量的实际类型。
使用auto定义变量时必须对其进行初始化,在编译阶段编译器会根据初始化表达式来推导auto的实际类型。
2,使用细则
1>与指针和引用的的结合
当我们使用auto声明指针类型时,auto和auto*是没有区别的。但当我们声明引用变量时,必须加&。
2>在同一行定义多个变量
当在同一行定义多个变量时,这些变量必须都是相同的类型,否则编译器会报错。因为编译器只会对第一个变量进行类型的推导,之后会把这个推导出来的结果应用在后续的变量上。
3,不能推导的场景
1>auto不可以作为函数的参数,因为编译器无法对函数参数的实际类型进行推导
2>auto不可以直接用来声明数组
三,范围for
1,范围for的语法
对于一个有范围的集合,由程序员来说明范围是多余的,并且很容易犯错误,故C++11提供了范围for。for循环后面的括号由:分为了两个部分,第一部分是在范围内用于迭代的变量,第二部分则表示迭代的范围。
范围for一般会和我们刚才学习的auto一起使用。
范围for只可以用传值或传引用接收,不会识别指针类型。
int arr[10]={1,2,3,4,5,6,7,8,9,10};
//对于一个数组,我们以前想要遍历他得写这样的代码:
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
cout<<arr[i]<<" ";
}
//当我们使用范围for,代码就会简洁很多
for(auto e : arr)
{
cout<<e<<" ";
}
//如果我们在遍历的同时,还想将所有的数值变大两倍,则可以用引用
//对于以下代码,e就是arr中各个数据的别名,所以e变化会引起arr内数据的变化
//同样的,若是我们不写&,e就是arr内数据的临时拷贝,e的变化不会引起arr变化
for(auto& e : arr)
{
e*=2;
cout<<e<<" ";
}
2,范围for的使用条件
1>迭代的范围必须是确定的
对于数组是第一个元素和最后一个元素的范围;对于类而言,应该是提供的begin与end。
2>迭代的对象要实现++与==的操作
四,nullptr
1,NULL
在c语言使用的NULL,其实是定义的一个宏,位于<stddef.h>中。
#define NULL 0
NULL被定义成为了字面常量0,或者被定义为无类型指针(void*)的常量,这会引起一些麻烦。
2,nullptr
当nullptr表示指针空值时,不需要包含头文件,因为nullptr是一个新关键字,用于替代NULL。并且,sizeof(nullptr)与sizeof((void*)0)所占字节数相同。
为了提高代码的健壮性,建议表示指针空值时不要使用NULL,而是使用nullptr。
本节小结: