C++函数重载

6 篇文章 0 订阅
1 篇文章 0 订阅

一、函数重载的概念

C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参函数(参数个数或类型或顺序)必须不同,常用来处理实现功能类似的数据类型不同的问题。

//int Add(int a, int b)
//{
//	return a + b;
//}
//
//double Add(double a, double b)
//{
//	return a + b;
//}
//
//long Add(long a, long b)
//{
//	return a + b;
//}
//
//int main()
//{
//	Add(10, 20);
//	Add(10.0, 20.0);
//	Add(10L, 20L);
//	return 0;
//}

注:
1.必须在同一作用域中
2.返回值类型不同,参数列表相同,不构成重载

为甚返回值不同,参数列表相同就不构成重载了呢?
1.概念:与返回值类型是否相同无关,有些编译器在实现时没有严格按照规则来
2.虽然函数有返回值,没有规定每次调用必须接收

二、名字修饰

1.函数重载调用原理

在C/C++中,一个程序要运行起来,需要进行以下几个阶段:预处理、编译、汇编、链接。
编译:检查语法问题
在编译的过程中实参类型进行推演,推演是指结果选用合适的函数进行调用,如果没有合适的类型,编译器尝试进行隐式转换,转换后有合适类型则调用,否则报错。

C语言不支持函数重载。在c中编译器在编译中会修改,只在名字前加_

#include<stdio.h>

 void Add(int a, int b);
 
int main()
{
	Add(1,2);
	return 0;
}

在这里插入图片描述
在C++中则会出现这样的一系列符号

void Add(int a, int b);
 
int main()
{
	Add(1,2);
	return 0;
}

在这里插入图片描述

2.符号解释

在vs编译器下的C++结果----函数只声明不定义 ?Add@@YAXHH@Z
?:开头
Add:函数名
@:函数名结束
@YA:接下来返回值类型+参数列表类型
X:void型
H:int型
@Z:表示结束

在linux下的结果较为清晰简单 <_Z3Addii>
这个是指_Z开头,3指三个字的函数名Add,i代表int

这就表示了C语言没办法支持重载,因为同名函数没办法区分。而c++通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

三、extern ‘‘C’’

在函数前加extern “C”,意思是告诉编译器,将该函数按照C语言规则来编译。

extern "C" void Add(int a, int b);
 
int main()
{
	Add(1,2);
	return 0;
}

在这里插入图片描述链接报错就是_Add

总结

以上就是对于函数重载的讲述,有什么错误的地方希望得到大家的点评。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值