为什么会存在函数重载?
在C语言中,有时候需要根据不同的数据类型调用不同名的函数,如果这种情况较多的话,对于写程序的人来说,要分别编写功能相同但名字不同的函数是很不方便的,所在在C++中引入了函数重载。函数重载就是用来实现功能类似而处理的数据类型不同的问题。
例如下面的代码,都是实现两个数求和,但由于参数类型的不同,写出了4个求和函数,如果这种情况较多的话,对于写程序的人来说,要分别编写功能相同但名字不同的函数是很不方便的。
int Sum1(int a,int b)
{
return a+b;
}
double Sum2(double a,double b)
{
return a+b;
}
double Sum3(double a,int b)
{
return a+b;
}
double Sum4(int a,double b)
{
return a+b;
}
为什么C语言不支持重载,C++支持重载?
在编译阶段,编译器对函数的名字进行了修改,C语言和C++对函数符号的处理规则是不同的,以下面两个函数为例:
在C++中,函数符号的生成与函数名、调用约定、返回值和形参列表有关
具体格式为:?函数名@@调用约定 返回值 参数类型@Z
“?“ 表示开始,默认的调用约定为_cdecl,用YA表示,int类型用H表示,double类型用N表示,@Z便是结束
int Sum(int a,int b) ?Sum@@YAHHH@Z
int Sum(double a,double b) ?Sum@@YAHNN@Z
可以看出,虽然两个函数名相同,但生成的符号是不同的,链接时系统会根据参数的不同匹配到对应的函数并调用。
在C语言中,两个函数生成的符号都是_Sum,系统在调用时无法知道到底要调用哪一个函数,这会让编译器产生二义性。
函数重载的定义
函数重载是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但这些同名函数的形式参数不同(包括参数的个数不同、类型不同和顺序不同),也就是说用同一个函数完成不同的功能。函数重载不依赖返回值,即返回值可以相同也可以不同,
重载的三要素:1、作用域相同
2、函数名相同
3、参数不同,参数的个数、类型和顺序不同
下面的Sum函数构成了重载:
int Sum(int a,int b)
{
return a+b;
}
double Sum(double a,double b)
{
return a+b;
}
double Sum(double a,int b)
{
return a+b;
}
double Sum(int a,double b)
{
return a+b;
}