函数重载
目录:
什么是函数重载?
C++允用同一函数名定义多个函数,而这些函数的参数个数和参数类型可以不相同。这就是函数重载。即对一个函数名重新赋予它新的含义,是一个函数名可以多用。所谓重载,就是“一物多用”。不仅函数可以重载,运算符也可以重载。
main函数不能重载,因为程序的入口只能有一个!
演示代码:
#include<iostream>
using namespace std;
int max(int a, int b)
{
return(a > b ? a : b);
}
int max(int a, int b, int c)
{
if (a < b) a = b;
if (a < c)a = c;
return a;
}
double max(double a, double b, double c)
{
if (a < b) a = b;
if (a < c)a = c;
return a;
}
long max(long a, long b, long c)
{
if (a < b) a = b;
if (a < c)a = c;
return a;
}
int main()
{
int max(int a,int b,int c); //函数声明
int max(int a,int b);
double max(double a,double b,double c);
long max(long a, long b, long c);
int j1, j2,j; //求两个整数的最大值
cin >> j1 >> j2;
j = max(j1,j2);
cout<< "j_max = " << j << endl;
int i1, i2, i3, i; //求三个整数的最大值
cin >> i1 >> i2 >> i3;
i = max(i1,i2,i3);
cout << "i_max = " << i << endl;
double d1, d2, d3, d; //求三个双精度数的最大数
cin >> d1 >> d2 >> d3;
d = max(d1,d2,d3);
cout << "d_max = " << d << endl;
long l1, l2, l3, l; //求三个长整型数的最大数
cin >> l1 >> l2 >> l3;
l = max(l1,l2,l3);
cout << "l_max = " << l << endl;
}
代码分析:
实现后,只需要调用max函数,编译器会根据我们传递实参的类型和个数推断出想要调用哪个max函数。重载函数的参数个数,参数类型,参数顺序,三者至少有一种不同,且必须在同一个作用域内。返回值的类型可以相同也可以不同。(不要使用函数重载实现不太想干的功能,可读性不高!)
为什么c++支持重载而C语言不支持重载?
C语言在编译过程中并不会对同名函数不同类型进行重命名。
C++在编译过程中对函数重命名的规则保证了重载函数在重命名后函数名的唯一性:
重命名函数名=(返回值类型)作用域+原始函数名+参数列表;
编译器内部完成了翻译部分:
1.预处理
1)头文件展开 2)宏的替换 3)去注释 4)条件编译
2.编译过程:将高级语言转为汇编语言
3.汇编过程:汇编语言转为二进制程序
链接部分:所引用的数据链接进来
比如一个函数的声明如下:
void function(int x,int y);
在c语言中,编译器在编译后在库中的名字为_function
在c++中,编译器在编译后在库中的名字为_function_int_int
还有一个函数的声明如下:
void function(float x,float y);
在c语言中,编译器在编译后在库中的名字为_function
在c++中,编译器在编译后在库中的名字为_function_float_float
在链接时,都是找名字进行链接的,就比如以上两个函数,
在C语言中两个的名字一样,就会在链接中报错。
C++中它们的名字不一样,所以就不会报错。
C++中能否将一个函数按照C的风格来编译?
1、如果要将C++的一个函数按照C语言的风格来编译,在函数声明前面加上extern “C”
2、要将多个函数按照C语言方式来编译,则可以使用
#ifdef __cplusplus
extern "c"{
#endif
函数描述
#ifdef __cplusplus
}
#endif
c++函数重载底层处理
c++底层有重命名机制
int ADD(int left,int right);
编译之后函数名修改为(?Add@@YAHHH@Z)
Char Add(int left,int right);
编译之后函数名修改为(?Add@@YADHH@Z)
在c++中,底层的重命名机制将函数根据参数的个数,参数的类型,返回值的类型都做了重新命名。给定了返回值类型和参数类型,所以在编译之后,不会有重定义情况出现。
C语言中,编译之后C语言链接器将函数名改为_Add ,没有给定返回值类型和参数类型,所以会重定义。