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

在这里插入图片描述

🎈归属专栏:浅尝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语言源文件(testforc.c)👇

#include <stdio.h>

void func(int a)
{
	printf("%d\n", a);
}

int main()
{
	func(1);
	return 0;
}

我们先对上述代码进行预处理、编译操作,形成汇编文件(testforc.s)。汇编文件部分内容如下图👇,我们可以看到,func函数在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。
在这里插入图片描述

下面是我们要进行演示的C++语言源文件(testforcpp.cpp)👇

#include <iostream>
using namespace std;

void func(int a)
{
	cout << a << endl;
}

void func(double a)
{
	cout << a << endl;
}

int main()
{
	func(1);
	func(1.1);
	return 0;
}

一样的,首先我们对源文件进行预处理和编译操作,我们来看一下testforcpp.s文件中的func函数。可以发现第一个函数名是_Z4funci,第二个函数名是_Z4funcd,也就是说,编译器通过将类型名融入到函数名的方式,对不同的函数做区分。在g++中,函数命名方式为_Z+函数长度+函数名+类型首字母。在gcc中,将C语言源文件编译后并不会将类型名融入函数名,因而C语言不支持函数重载。这就是名称修饰
在这里插入图片描述

注意事项

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

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

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

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值