5.函数重载
5.1概念
函数重载:是函数的一种特殊情况,C ++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。
int Add(int left, int right)
{
return left+right;
}
double Add(double left, double right)
{
return left+right;
}
long Add(long left, long right)
{
return left+right;
}
int main()
{
Add(10, 20);
Add(10.0, 20.0);
Add(10L, 20L);
return 0;
}
返回值不同不是函数重载
short Add(short left, short right)
{
return left+right;
}
int Add(short left, short right)
{
return left+right;
}
5.2名字修饰(名称Mangling)
在C / C ++中,一个程序要运行起来,需要经历以下几个阶段:预处理,编译,汇编,链接。
名称Mangling是一种在编译过程中,将函数,变量的名称重新改编的机制,简单来说就是编译器为了区分各个函数,将函数通过某种算法,重新修饰为一个全局唯一的名称。
ç语言的名字修饰规则非常简单,只是在函数名字前面添加了下划线比如,对于以下代码,在最后链接时就会出错:
int Add(int left, int right);
int main()
{
Add(1, 2);
return 0;
}
编译器会报错:
上述添加函数只给了声明没有给定义,因此在链接时就会报错
从报错结果中可以看到,C语言只是简单的在函数名前添加下划线。因此当工程中存在相同函数名的函数时,就会产生冲突。
由于C ++要支持函数重载,命名空间等,使得其修饰规则比较复杂,不同编译器在底层的实现方式可能都有差异。
#include<iostream>
using namespace std;
int Add(int x1, int x2);
double Add(double d1, double d2);
int main()
{
Add(1, 3);
Add(1.2, 2.4);
return 0;
}
通过上述错误可以看出,编译器实际在底层使用的不是添加名字,而是被重新修饰过的一个比较复杂的名字,被重新修饰后的名字中包含了:函数的名字以及参数类型。就是为什么函数重载中几个同名函数要求其参数列表不同的原因。只要参数列表不同,编译器在编译时通过对函数名字进行重新修饰,将参数类型包含在最终的名字中,就可保证名字在底层的全局唯一性。
5.3 extern“C”
有时候在C ++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern“C”,意思是告诉编译器,将该函数按照C语言规则来编译。
1. C语言中为什么不能支持函数重载:
ç语言的名字修饰规则在函数名前边简单的加一个 '_'
2. C ++中函数重载底层是怎么处理的:
编译器实际在底层使用的不是直接使用函数名字,而是被重新修饰过的一个比较复杂的名字,被重新修饰后的名字中包含了:函数的名字以及参数类型
3. C ++中能否将一个函数按照C的风格来编译:
可以在函数前加extern“C”