【C++】函数重载

1.函数重载的背景

C语言中,我们写一个这样的一个函数

int Add(int a,int b)
{
	return a + b;
}

这是一个求两个数之和的函数,但是这样写有一个不足之处就是该函数只能求int类型的和,如果我们是double类型的和,这个函数就没办法完成,需要重新写一个double类型的求和函数

double Add2(double a,double b)
{
	return a + b;
}

但是这时候因为在C语言函数名不能一样,所以我们一个加法函数就会有很多命名,这会造成不必要的麻烦,那么我们能不能将这个加法函数名统一成一个函数名呢

于是C++引入了函数重载。

2.函数重载的概念

函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题

2.1参数类型不同的重载

int Add(int a, int b)
{
	return a + b;
}
double Add(double a, double b)
{
	return a + b;
}

2.2参数个数不同的重载

void fun()
{
	cout << "无参数" << endl;
}
void fun(int a)
{
	cout << a << endl;
}
int main()
{
	fun();//调用fun()打印无参数
	fun(1);//调用fun(int a),打印1
	return 0;
}

2.3参数类型顺序不同的重载

void fun(int a,char b)
{
	cout << a << b << endl;
}
void fun(char a,int b)
{
	cout << b << a << endl;
}
int main()
{
	fun(1,'a');//调用fun(int a,char b),打印1a
	fun('b', 2);//调用fun(char a,int b)打印2b
	return 0;
}

2.4注意事项:仅仅是返回值不同无法构成函数重载

如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分


错误写法!!!

void  f()
{
	cout << "无返回值" endl;
}
int f()
{
	return 1;
}
int main()
{
	int a = f();//编译器不知道调用哪个函数
	f();//有返回值也不一定要接收,所以无法区分
	return 0;
}

在这里插入图片描述

3.C++函数重载的原理—函数名字修饰

C++如何追踪每一个重载函数呢?它给这些函数指定了一个身份。使用C++开发工具中的编译器编写和编译程序时,C++编译将执行一个神奇的操作----名称修饰(name decoratiom)或名称矫正(name mangling),它根据函数原型中指定的形参类型对每个函数名加密。
请看下述未经修饰的函数原型:
double fun(int,double);
这些各式对于人类来说很适合;我们知道函数接受两个参数(一个为int类型,另一个为double类型),并返回一个double 值。而编译器将名称转换为不太好看的内部表示,来描述该接口,如下所示:
?fun@@YAXH
对原始名称进行的表面看起来无意义的修饰(或矫正)将对参数数目和类型进行编码。添加的一组符号随函数特征标而异。而修饰使用的约定随编译器而异,不同编译器的修饰规则不同。

总的来说就是,C++的函数,进行函数重载的时候,一些表面看上去名字相同,
但是底层的是进行了名称修饰的,编译器根据这些名称修饰去区分这些相同名称的函数。

而C语言是没有这种函数修饰的,它是直接根据函数名去寻找对应函数的。

4.函数重载总结

C++函数重载解决了C语言因为数据类型不同而功能相同时的问题
构成函数重载的三个条件是:
1.数据类型不同
2.参数数量不同
3.数据类型顺序不同
只有C++有函数重载,因为编译器底层会对C++函数名称进行修饰
C语言无名称修饰

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fun gun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值