概念
是c++中函数的一种特殊情况。在相同的作用域,函数名字相同而参数列表不同,函数形成重载。
参数列表
参数列表的不同体现在以下几点:
- 参数个数不同
- 参数类型次序不同
- 参数类型不同
注意:与返回值类型相同与否无关
test
#include<iostream>
using namespace std;
int myminus(int a, int b)
{
return a - b;
}
double myminus(int a, double b)
{
return a - b;
}
//出错:“int myminus(int,double)”: 重载函数与“double myminus(int,double)”只是在返回类型上不同
//int myminus(int a, double b)
//{
// return a - b;
//}
double myminus(double a, int b)
{
return a - b;
}
double myminus(double a, double b)
{
return a - b;
}
int main()
{
myminus(10, 5);
myminus(13, 1.5);
myminus(10.5, 1.2);
return 0;
}
实现
编译器在编译阶段,对实参的类型进行推演,对函数进行名字修饰。根据推演实参类型的结果选择调用相应函数。
名字修饰
名字修饰是一种在编译过程中,将函数、变量的名称重新改编的机制,简单来说就是编译器为了区分各个函数,将函数通过某种算法,重新修饰为一个全局唯一的名称。
在c语言中名字修饰的规则非常简单,在底层无法根据参数类型生成名字,只是在函数名前加”_“。所以C语言不支持函数重载。
而在c++中,名字修饰规则较为复杂,虽然不同编译器对应关系跟不同。但是规则是一样的:“作用域+返回类型+函数名+参数列表”。
若在c++程序中需要函数以C语言风格编译,可以在函数前加上 extern “C”
如:
extern "C"int myminus(int a, int b)
{
return a - b;
}