本篇主要介绍C++ 中的函数重载、缺省参数、哑元与内联。
函数重载
概念
同一个作用域中,函数的名字相同,函数的参数列表不同,这样的函数构成重载。
方式
-
函数名相同,函数的参数类型不同
-
函数名相同,函数的参数个数不同
-
函数名相同,函数的参数顺序不同
-
const
修饰的常函数和非const
修饰的函数也可以构成重载
特殊重载关系
-
使用不同范围的方式导入命名空间时,那么局部优先
-
当使用相同范围的方式导入命名空间时,那么如果不构成重载,则编译报错产生歧义
函数匹配原则
完全匹配 > 常量转换 > 升级转换 > 标准转换 > 自定义类型转换 > 省略匹配
函数重载原理
-
C++ 编译器通过对函数进行换名,将参数列表信息体现在新的函数名中,从而实现重载
-
C 程序和 C++ 程序的结合:
extern "C"
表示告诉编译器,不要对我所修改的函数进行换名,从而满足 C 程序可以直接通过原来的函数名进行调用
缺省参数
首先举个栗子:
void fn(int i = 66){}
fn(118);// i = 118;
fn();// i = 66;
例子中的 int i = 66
就表示了一个缺省参数,如果没有传入该参数,则内部调用将取其默认值。
如果函数中有缺省参数,那么缺省参数必须靠右排列,也就是说如果某个参数有缺省值,那么这个参数右侧的所有参数都必须有缺省值。
再举个栗子:
void fn(int i,char c = 'A',char* p = NULL){} // 正确
void fn(int i,char c = 'A',char* p){} // 错误,最后一个参数也应该有缺省值
如果函数的声明和定义分开,那么参数的缺省值只能写在函数的声明部分。
注意:
-
在 C 语言中如果没有对函数进行声明,会自动做隐式声明,可能产生警告,但是在 C++ 中会直接编译报错。
-
当函数具有缺省参数时,要注意避免函数重载时产生歧义。
-
像
void fn(){}
这样的函数,在 C 语言中表示可以接受任意多个实参,而在 C++ 中表示不接收任何实参。
哑元
概念
只有类型,没有名称的参数叫做哑元。
举个栗子:
void fn(int i){} // 正常函数
void fn(int) {} // 哑元函数
调用
虽然哑元函数没有参数名,但调用时不能省略参数的传入。
fn(66);
fn(); // 错误
用途
-
兼容以前的代码
-
区分自增自减运算符的重载
内联
使用关键字 inline
修饰的函数叫内联函数。内联函数可以像 C 语言中的宏一样进行替换,但是不是简单的代码替换,而是经过分析之后的指令替换。
注意,inline
关键字只是一种请求,而不是要求,所有最后是否内联由编译器说了算;即使没有使用inline
关键字,编译器也可能做内联处理。