【浅尝C++】函数重载及其原理

【浅尝C++】函数重载及其原理_第1张图片

归属专栏:浅尝C++
个人主页:Jammingpro
记录一句:芜湖,开始新的一篇博客了!


文章前言:本篇文章简要介绍C++中的函数重载,介绍每个小点时,都会附上对应的代码,如果可能的话。


文章目录

  • 函数重载的概念
    • 参数个数不同
    • 参数类型不同
    • 类型顺序不同
  • 函数重载的原理
  • 注意事项


函数重载的概念

是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。
ps:只要函数名相同,且参数列表满足①参数个数不同②参数类型不同③参数类型顺序不同的其中一个,则构成函数重载。

参数个数不同

下面这两个函数可以构成函数重载(两个函数同名,第一个函数具有2个参数,第二个函数具有3个参数,满足参数个数不同,因此构成函数重载

int Add(int num1, int num2)
{
	return num1 + num2;
}
int Add(int num1, int num2, int num3)
{
	return num1 + num2 + num3;
}

参数类型不同

以下两个函数用于识别输入参数的类型,两个函数的函数名相同,参数个数相同,但满足参数类型不同,因此可以构成函数重载。

void Type(int input)
{
	cout << "type:int" << endl;
}
void Type(double input)
{
	cout << "type:double" << endl;
}

类型顺序不同

下面两个函数的函数名相同,参数个数相同,但其参数类型顺序不同(第一个先char再int,第二个先int再char),因而可以构成函数重载。

void getInfo(char sex, int age)
{
	cout << "sex:" << sex << endl;
	cout << "age:" << age << endl;
}
void getInfo(int age, char sex)
{
	cout << "age:" << age << endl;
	cout << "sex:" << sex << endl;
}

函数重载的原理

为什么C++支持函数重载,而C语言却不支持呢?这是因为:C++有名字修饰。在介绍名字修饰之前,我们一起回顾以下编写完的C++程序到底要怎么才能跑起来呢?这就需要经过预处理编译汇编链接,才能生成可执行文件。每个阶段需要执行的Linux指令和生成的文件类型都在下图了
【浅尝C++】函数重载及其原理_第2张图片
下面是我们要进行演示的源文件

#include
using namespace std;

void getInfo(char sex, int age)
{}

void getInfo(int age, char sex)
{}

int main()
{
	getInfo('M', 18);
	getInfo(20, 'W');
	return 0;
}

首先我们对源文件进行预处理和编译操作,我们来看一下test_cpp.s文件中的getInfo函数。可以发现第一个函数名是_Z7getInfoci,第二个函数名是_Z7getInfoic,也就是说,编译器通过将类型名融入到函数名的方式,对不同的函数做区分。在g++中,函数命名方式为_Z+函数长度+函数名+类型首字母。在gcc中,将C语言源文件编译后并不会将类型名融入函数名,因而C语言不支持函数重载。这就是名称修饰
【浅尝C++】函数重载及其原理_第3张图片

注意事项

如果函数名相同,参数个数相同、类型相同、类型顺序相同,而其返回值不同,这种情况无法构成重载
从上述的函数重载原理可知,函数返回值并不会修饰入编译后的函数名中,因此下面两个函数编译后的函数名仍然是相同的,链接时因无法确定唯一的函数地址而报错。

//以下两个函数无法构成函数重载
int Add(int num1, double num2)
{
	return num1 + num2;
}
double Add(int num1, double num2)
{
	return num1 + num2;
}

文章结语:这篇文章对C++中的函数重载进行了简要的介绍。
欢迎进入浅尝C++专栏,查看更多文章。
如果上述内容有任何问题,欢迎在下方留言区指正b( ̄▽ ̄)d

你可能感兴趣的:(#,浅尝C++,c++,开发语言)