一、函数重载的概念
C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参函数(参数个数或类型或顺序)必须不同,常用来处理实现功能类似的数据类型不同的问题。
//int Add(int a, int b)
//{
// return a + b;
//}
//
//double Add(double a, double b)
//{
// return a + b;
//}
//
//long Add(long a, long b)
//{
// return a + b;
//}
//
//int main()
//{
// Add(10, 20);
// Add(10.0, 20.0);
// Add(10L, 20L);
// return 0;
//}
注:
1.必须在同一作用域中
2.返回值类型不同,参数列表相同,不构成重载
为甚返回值不同,参数列表相同就不构成重载了呢?
1.概念:与返回值类型是否相同无关,有些编译器在实现时没有严格按照规则来
2.虽然函数有返回值,没有规定每次调用必须接收
二、名字修饰
1.函数重载调用原理
在C/C++中,一个程序要运行起来,需要进行以下几个阶段:预处理、编译、汇编、链接。
编译:检查语法问题
在编译的过程中实参类型进行推演,推演是指结果选用合适的函数进行调用,如果没有合适的类型,编译器尝试进行隐式转换,转换后有合适类型则调用,否则报错。
C语言不支持函数重载。在c中编译器在编译中会修改,只在名字前加_
#include<stdio.h>
void Add(int a, int b);
int main()
{
Add(1,2);
return 0;
}
在C++中则会出现这样的一系列符号
void Add(int a, int b);
int main()
{
Add(1,2);
return 0;
}
2.符号解释
在vs编译器下的C++结果----函数只声明不定义 ?Add@@YAXHH@Z
?:开头
Add:函数名
@:函数名结束
@YA:接下来返回值类型+参数列表类型
X:void型
H:int型
@Z:表示结束
在linux下的结果较为清晰简单 <_Z3Addii>
这个是指_Z开头,3指三个字的函数名Add,i代表int
这就表示了C语言没办法支持重载,因为同名函数没办法区分。而c++通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
三、extern ‘‘C’’
在函数前加extern “C”,意思是告诉编译器,将该函数按照C语言规则来编译。
extern "C" void Add(int a, int b);
int main()
{
Add(1,2);
return 0;
}
链接报错就是_Add
总结
以上就是对于函数重载的讲述,有什么错误的地方希望得到大家的点评。