一、函数重载的概念
C++中允许存在同名函数,但要求函数参数的类型、个数不同,这些同名函数就称为函数的重载。
void func(int a, int b)
{cout << "func(int a, int b)" << endl;
}void func(double a, double b)
{cout << "func(double a, double b)" << endl;
}void func(int a, int b, int c)
{cout << "func(int a, int b, int c)" << endl;
}
二、C++实现函数重载的原理
C语言不支持函数重载,因为编译器在编译时会根据函数名寻找函数的地址。函数名相同,编译器就无法区分这些函数。
C语言源码的编译链接过程如下:
假设有一个函数func,函数声明在头文件func.h中,函数定义在源文件func.c中,主函数main在源文件test.c中。
编译器首先对三个文件进行预处理,生成func.i和test.i文件;再将两个C语言文件翻译为汇编语言,生成func.s和test.s文件,在test.s文件中有汇编语句 call func(?),这意味着将要从其他文件中找到func函数的地址,而函数的地址就是函数的定义,在func.s中;接着汇编器对两个文件进行汇编,生成func.o和test.o文件;最后将两个文件链接,生成可执行程序 .exe文件 。
C++支持函数重载的原理:
在链接时引入了函数名修饰规则,即在函数名中引入参数类型(各个编译器平台都有自己的一套修饰规则)。这样编译器在进行汇编时就不会因为函数名相同而无法找到对应函数的地址了。
例如,在Linux系统下编译器的函数名修饰规则
函数void func(int a, int b)会被修饰为 Z4funcii
函数void func(double a, double b)会被修饰为 Z4funcdd
函数void func(int a, int b, int c)会被修饰为 Z4funciii