前言
在c++中,出现重载的概念,其实就是一个高级语言的象征,他的出现就是机器语言更加的自然化,他其实可以理解位我们自然语言中的动词,它可以和不同的名词起到不同的功能
重载
定义:用一个相同的函数名来定义不同的函数
重载的条件:
参数的个数不同
参数的类型不同
参数的顺序不同
注与函数的返回值没有关系
但是在c++中,因为有默认参数的存在,所以有时候会产生二义性,就比如下面这个程序,编译会报错
int func (int a,int b,int c=0)
{
return a+b+c;
}
int func (int a,int b)
{
return a+b;
}
int main ()
{
func (1,2);
}
因为c++存在默认参数,所以这种情况存在歧义,所以这样写不对
c++重载调用准则
将所有的同名作为候选者
尝试寻找可行的候选函数
--精准匹配形参
通过默认参数可以匹配到实参
通过默认类型转换匹配到实参
--匹配失败
最终找的的候选函数不唯一,出现二义性,编译失败
无法匹配到候选者,函数未定义失败
之后我们通过研究重载函数的入口地址,我们可以发现在编译器内部他其实是两个不同的函数
使用函数指针来调用重载函数
这个其实和之前一样,我们所强调的c++是一个强类型的语言,当类型不符合的时候,他就会报错
- 他会根据重载规则挑选与函数指针列表一致的重载函数
- 他会严格的检查函数类型和指针类型
注
1.函数重载必须发生在同一个作用域里
2.编译器需要函数列表或者参数名进行函数选择
3.无法直接通过函数名得到函数重载入口地址
c代码和c++代码的共用
如果你想在c++中运行c代码,你可以加上下面这个宏,他在c++中会被识别,而在c语言中就不会被识别
#ifdef _cplusplus
extern "c" {
#endif
需要的代码
#ifdef _cplusplus
}
#endif
注
c++不能以c的编译方式进行编译,会在符号表中生成目标名
编译方式决定了函数被编译以后的目标名
- c++将函数名和参数列表编译成目标名
- c只将函数名编译成目标名
我们可以很明确的知道c++会多编译参数列表