C++入门基础(二)-函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了

函数重载概念

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

例子1 参数类型不同

int Add(int a, int b)
{
	cout << "int add(int a, int b) " << endl;
	return a + b;
}
double Add(double a, double b)
{
	cout << "double add(double a, double b) " << endl;
	return a + b;
}
int main()
{
	Add(1, 2);
	Add(1.0, 1.2);
	return 0;
}

在这里插入图片描述

例子2 参数的个数不同

int Add(int a, int b)
{
	cout << "int add(int a, int b) " << endl;
	return a + b;
}
int Add(int a)
{
	cout << "int add(int a) " << endl;
	return a ;
}
int main()
{
	Add(1, 2);
	Add(1);
	return 0;
}

在这里插入图片描述

例子3 参数的顺序不同

int Add(int a, double b)
{
	cout << "int add(int a, int b) " << a+b<<endl;
	return a + b;
}
int Add(double b,int a)
{
	cout << "int add(int a) " <<a+b<< endl;
	return a+b ;
}
int main()
{
	Add(1, 2.0);
	Add(1.0,2);
	return 0;
}

在这里插入图片描述

C++支持函数重载的原理–名字修饰(name Mangling)

在上面的缺省函数中有提到过,C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接

为什么C++和C语言都要经历这几个阶段,而C++却可以支持函数重载呢?

在C语言实现声明和定义的分离时,如果函数名重复,那么编译器在链接的过程中会根据函数名去找函数的地址,而由于函数名重复,导致分不清具体是要用哪个函数,所以会报链接错误
在这里插入图片描述
而C++却可以
在这里插入图片描述
所以C++和C语言在链接部分是有一些不同的
事实上C++在链接中并不是直接用函数名去找地址,而是根据不同的参数类型,返回值的类型等等用一些手段去修饰函数,各个编译器的方式是不一样的

我们以linux为例

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

这个函数在修饰后为-Z3addii,其中3为函数名长度,后面两个i为参数类型

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

这个函数在修饰后为-Z3adddd

上一篇:【方案解决思路】RPC服务器不可用


下一篇:HarmonyOS开发案例:【排行榜页面】