1、函数参数的默认值(c++特有)
在函数声明或定义的地方,给函数参数加上默认的参数,在函数调用处,可以不必给该参数传值,会默认传入默认值。
- 参数默认值的赋值
必须从右向左,依次赋值。
- 参数默认值的作用域
在同一作用域中,函数参数的默认值,不可以重复赋值。
2、宏函数和内联函数(c++)
宏函数:
优点:1、不存在栈帧的开辟
2、不存在参数的带入
3、不存在参数的带出
4、不存在参数的清除
缺点:1、不存在安全检查(类型检查)
2、不可以调试
内联函数:在普通函数前加上inline即可构成内联函数,内联函数会在调用点展开
问题1:内联函数在什么时候展开?
在编译期展开。
不在预编译期展开的原因:因为预编译期不进行类型检查,如果在预编译期展开就无法进行类型检查,就和宏函数一样了;
不在链接期展开的原因:因为在链接时,指令都已经生成完成,在此时展开并没有什么用。
注意:
符号无法使用有两种情况1、符号不存在2、符号不允许使用。符号分为local类型和global类型,local类型符号只允许在指定作用域使用,比如静态函数在编译期间生成的就是一个local符号,只允许在本文件引用。
内联函数在realse版本不产生符号,不可以调试。
在debug版本产生一个local类型的符号,可以调试,会进行栈帧开辟等动作。
inline | static | 宏函数 |
debug版本产生local符号 realse版本不产生服啊后 | 产生local符号 | 不产生符号 |
debug版本进行栈帧开辟等操作 realse版本直接在调用点展开(编译期) | 进行栈帧开辟操作 | 在调用点直接展开(预编译期) |
dubug版本可以调试 | 可以调试 | 不可以调试 |
有类型检查 | 有类型检查 | 没有类型检查 |
问题2:内联函数一定会展开吗?
inline是对编译器的一个建议,编译器会在具体情况考虑是否处理成内联,比如在递归的时候使用内联函数,在编译期间无法知道递归的次数,就无法确定展开多少次,无法展开。
3、函数重载(c++)
- c语言生成符号依靠函数名。
- c++依靠函数名和参数列表生成符号
函数重载有以下要素:
- 函数名相同
- 参数列表不同
- 处于同一作用域
注意:传参时的类型转换,容易出现多个重载函数都匹配的情况。