狄泰C++课程学习笔记:第八、九课:函数重载

1、函数重载发生的条件

前提:函数重载发生在同一作用域内

在函数名称相同的情况下构成函数重载的条件:

    * 形参列表类型不同

    * 形参列表顺序不同

    * 形参个数不同

    上述三个条件,任意满足其一,即可构成函数重载

    注:函数重载只和函数名、函数形参列表有关,和函数的返回值无关

2、当函数重载碰上函数默认参数

编译器在对源代码进行编译时,遵循的标准是函数的调用上不会产生二义性,如果对于某次函数调用来说,存在2个或2个以上的候选函数均满足该调用过程,则编译器会直接报错。

如:狄泰C++课程学习笔记:第八、九课:函数重载

此时,2个函数构成函数重载的关系,是合法的,因此可以编译通过

但。。这样的调用确不能成功

狄泰C++课程学习笔记:第八、九课:函数重载

3、当函数重载碰上函数指针

当使用函数指针来调用某个构成重载关系的函数时,原则为:

    * 严格匹配该函数的函数类型和函数指针对应的函数类型(这里强调一点:参数类型的隐式类型转换在这里都不可以)

如:狄泰C++课程学习笔记:第八、九课:函数重载

4、C++代码如何调用C代码

这里需要注意两点:

    * __cplusplus宏的存在

    * extern "C"的合理使用

即当某段代码需要使用C编译器进行编译时,先通过是否含有__cplusplus宏来判断当前代码是否为C++,然后根据判断结果来决定是否需要给接下来的代码添加extern "C"的显式C方式编译的声明

使用方式如:

狄泰C++课程学习笔记:第八、九课:函数重载

这样便能够保证,同样一份代码,使用C和C++编译器均可成功进行编译

但注意一点:一定不能使用C编译器来编译含有重载函数的代码,因为C编译器和C++编译器对于函数编译后的命名是不同的(C中没有函数重载的概念,函数编译出来就是一个原生的函数名与之对应,而C++编译编译出来的函数对应的标识符则除了参考函数名,还要参考函数的形参列表,命名规则不同)