C++怎样实现函数重载
C++函数重载是指:C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题,如下程序就是对不同类型的数据的加法函数的重载。
#include<iostream>
using namespace std;
int Add(int x, int y)
{
return x + y;
}
double Add(double x, double y)
{
return x + y;
}
int main()
{
Add(3, 4);
Add(3.5, 4.7);
return 0;
}
那么我们可能会问C++支持函数重载,为什么C语言不支持函数重载呢,是因为C++有其特有的函数名字修饰的方法。
首先一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。(参考C语言编译和链接)
预处理一般指:消除注释、宏替换、条件编译、头文件展开等一些操作。
编译:值将C程序转化为汇编语言、以及检查语法、语义是否正确,最后对写函数进行符号汇总。
汇编:将汇编语言转化为二进制的机器语言对每个源文件生成符号表。
链接:是通过链接器使生成的符号表合并,并且重新定位。
而C++支持函数重载使在汇编到链接这一步中的函数名修饰的规则不同,如下图所示C语言中函数名经过修饰后函数名不变(Linux环境下),而当我们在定义多个相同函数时,程序在链接时就不知到链接哪一个函数,因此C语言不支持函数重载。而相比于C++而言函数经过函数名规则修饰后会根据不同的函数参数类型。以及个数、顺序的不同而生成不同的函数名,因此在链接时可以根据输入的不同函数类型的函数定位到正确的函数,因此C++是根据改进函数名修饰规则后支持函数重载。