在C语言中我们学到了宏和宏函数,宏对于类型没有严格的限制,而且不需要建立栈帧,可以提高运行效率,但是宏不能进行调试,容易出错,而且没有类型检查。
为了补C语言中的坑,c++中出现了内联函数inline关键字,它和宏的用法相似,都是替换,是一种用空间换时间的方式,在调用中会直接替换函数体,缺点是会使目标文件变大,就是代码量太多,而且它在调用的时候不会建立栈帧。
当然,过长的代码可能会使目标文件变大,所以即使我们加上inline关键字我们编译器也不会直接将它认定为内联函数,加上inline只是一个对于编译器的请求,具体是否会被认定为内联函数是由编译器决定的,一般情况下我们可以将非递归且频繁调用的函数加上关键字inline。
注意:内联函数不可以声明和定义分离,因为内联函数不会生成符号表,它不靠地址去寻找函数,所以只有声明的话,就会无法将内联函数直接展开,所以一般情况下我们都是直接将内联函数定义在头文件之中的。
了解了内联函数,我们再来了解一个简便的关键字auto,auto可以根据右边的变量或者右边的返回值的类型来推导参数类型。
auto关键字在返回值很长的时候具有简化代码的作用,
这是后面的迭代器我们可以通过auto简化代码
注意:auto不能作为函数的参数,且不可以用来定义数组。
再往后,我们都知道C语言中的空指针称为NULL,事实上在底层的编码中,NULL是由宏定义为0的
我们来看下面的代码:
这样子会造成调用的歧义因为NULL也表示0,两个调用都会调用第一个f函数,如若要第二个f函数调用第二个重载,需要将NULL强制类型转化为int*类型,所以为了避免这种麻烦,c++中出现了新的一种空指针,叫做nullptr ,这就解决了混淆的问题。