默认形参
1、什么是默认形参
在C++中可以给函数的参数设置默认值,当函数被调用时如果调用者提供了实参则使用实参调用,如果没有提供则使用默认值调用
2、默认形参要靠右
如果函数有多个参数,并设置了默认形参,要遵循从右往左依次默认形参
3、只能在函数声明中设置默认形参
如果函数声明与定义是分开实现,只能在函数声明中设置默认形参,否则语法错误
4、默认形参可能会影响函数重载
如果对函数进行了重载,又设置了默认形参,调用时可能会有冲突和歧义,调用失败
因此对于重载过的函数设置默认形参时一定要谨慎
内联函数
1、普通函数
普通函数会被编译成二进制指令存储在代码段中,调用语句中会生成一条跳转指令,当程序运行到调用语句时,会跳转该函数在代码段中对应的位置执行,执行结束会返回
2、什么是内联函数
内联函数也会被翻译成二进制指令,但调用语句不会生成跳转指令,而是直接把内联函数的二进制指令进行替换,这样就没有跳转和返回,而是直接执行二进制指令,这种称为内联函数
3、显式内联和隐式内联
①显式内联:
在函数的返回值前加 inline 该函数就以内联函数的机制调用
②隐式内联:
在结构、联合、类中的成员函数会自动被当做内联函数处理
注意:如果在结构、联合、类中声明成员函数,但是在外面定义,则不会当做内联函数处理
注意:函数是否被内联由编译器以及它的优化等级决定,加 inline 只是有可能影响它的决定
注意:g++默认优化等级 -O -O1 下所有的内联函数都会当成普通函数处理;在-O2 -O3的优化级别下,甚至普通函数都可能会被当做内联函数的处理
注意:C99也支持 inline
4、内联的适用条件
优点:节约了函数传参、跳转、返回的时间,提高代码的运行速度
缺点:当被多个位置调用时,那么二进制指令会被拷贝多份,产生了冗余,导致可执行文件明显增加
适用条件:
①适合内容简单且同一位置频繁调用的函数
②不适合内容多、且多个位置、较少调用的函数,因为节约的时间还弥补不过牺牲的空间
③带有递归属性的函数无法内联,编译器会自动忽略
5、内联函数和宏函数的相同点和不同点
相同点:都是采用以空间换时间的策略提高程序的运行速度,减少函数调用跳转的耗时
不同点:
①宏函数不是真正的函数,只是语句替换,不会对参数进行类型检查、没有返回值、安全性低
②内联函数是真正的函数、严格检查参数类型、有返回值、安全性高