目录
一.概念
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题.
那么在这里为什么要引进函数重载呢???
在C语言中我们定义一个函数函数名不可以重名;但是我们会遇到以下情况:
int add(int a, int b) {
return a + b;
}
但是如果我们要进行浮点型或者double型的数字相加,那么在C语言中我们还要写两个函数..
而函数重载就刚好可以解决这种问题~~
二.代码实现
#include <iostream>
using namespace std;
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
double add(int a, double b) {
return a + b;
}
int main() {
cout << add(1, 2) << endl;
cout << add(1.1, 2.2) << endl;
cout << add(1, 2.2) << endl;
return 0;
}
在C++中,编译器会根据参数来判断调用哪个函数,我们来证明一下:
在上述代码中
第一行输出应该是调用int add(int a, int b);输出应为3;
第二行输出应该是调用double add(double a, double b);输出应为3.3;
第三行输出应该是调用double add(int a, double b);输出应为3.2;
运行结果为下:
三.原理剖析
那为什么C++支持函数重载,而C语言不支持函数重载呢?
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
在链接时,面对Add函数,这里每个编译器都有自己的函数名修饰规则,我们先来看一下C语言编译器的函数修饰规则是什么样的:
我们可以看出C语言编译器下的函数修饰规则是_add ;
我们再来看一下C++编译器的函数修饰规则: ?add@@YAHHH@Z
在C++编译器中我们发现函数修饰规则很复杂,而在C语言中函数修饰规则没有那么复杂,所以在C++编译器可以实现函数重载,编译器可以根据函数修饰来判断同名函数,而C语言则不可以..
C++在windows下的修饰规则:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!函数重载要求参数不同跟返回值没关系!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!