归属专栏:浅尝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指令和生成的文件类型都在下图了
下面是我们要进行演示的源文件
#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语言不支持函数重载。这就是名称修饰。
如果函数名相同,参数个数相同、类型相同、类型顺序相同,而其返回值不同,这种情况无法构成重载。
从上述的函数重载原理可知,函数返回值并不会修饰入编译后的函数名中,因此下面两个函数编译后的函数名仍然是相同的,链接时因无法确定唯一的函数地址而报错。
//以下两个函数无法构成函数重载
int Add(int num1, double num2)
{
return num1 + num2;
}
double Add(int num1, double num2)
{
return num1 + num2;
}
文章结语:这篇文章对C++中的函数重载进行了简要的介绍。
欢迎进入浅尝C++专栏,查看更多文章。
如果上述内容有任何问题,欢迎在下方留言区指正b( ̄▽ ̄)d