C++ :函数重载

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”

猜你喜欢

转载自blog.csdn.net/daxiongha/article/details/83508791