函数重载与递归函数

Posted on 2023-11-06,2 min read

函数重载

概念:
重载函数:同一作用域中出现函数名相同,参数不同,功能相似的函数,而这些函数重载一般会有两个或两个以上的函数,取相同的函数名,但是形参的个数和类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动决定调用哪一个函数。

代码展示:


#include
using namespace std;
int min(int a,int b)//返回整型,且只接收两个整型
{
	if (a > b)
		return b;
	else
		return a;
}
float min(float a, float b)//返回浮点型(小数),且只接收两个浮点型
{
	if (a > b)
		return b;
	else
		return a;
}
float min(int a, float b)//返回浮点型,且只接收一整型一浮点型
{
	if (a > b)
		return b;
	else
		return a;
}
int min(int a, int b,int c)//返回整型,且只接收三个整型
{
	int d=a;
	if (b < d)
		d = b;
	if (c < d)
		d = c;
	return d;
}
int main()
{
	int a, b, e;
	float c, d;
	cout << "俩整数取最小" << endl;
	cin >> a >> b;
	cout << min(a, b)<> c >> d;
	cout << min(c, d) << endl;//对应第二个min函数
	cout << "一整数一小数取最小" << endl;
	cin >> a >> c;
	cout << min(a, c) << endl;//对应第三个min函数
	cout << "三整数取最小" << endl;
	cin >> a >> b >> e;
	cout << min(a, b, e) << endl;//对应第四个min函数
	return 0;
}

运行结果

如果返回值类型不同,参数相同是非法的,编译会不通过

确定对重载函数的哪个函数进行调用的过程称为绑定(binding),绑定的优先次序为精确匹配、对实参的类型向高类型转换后的匹配、实参类型向低类型及相容类型转换后的匹配。
通俗点讲就是
首先,编译器会尝试进行精确匹配,即找到与实参类型完全匹配的函数定义。整型对整型,浮点型对浮点型
如果不存在精确匹配的函数定义,编译器会尝试进行隐式类型转换。它会将实参的类型向高类型进行转换,并尝试匹配函数定义的参数类型。例如,如果实参是int类型,但没有找到接受int类型参数的函数定义,编译器会将int类型向高类型转换为long或float类型,然后再进行匹配。
如果仍然找不到匹配的函数定义,编译器会尝试将实参的类型向低类型进行转换,并再次进行匹配。例如,如果实参是float类型,但没有找到接受float类型参数的函数定义,编译器会将float类型向低类型转换为int类型,然后再进行匹配

相容类型转换是指将实参类型转换为与函数定义参数类型相兼容的类型。例如,将const修饰的实参传递给不带const修饰的参数。
先后顺序就是精确匹配 > 对实参的类型向高类型转换后的匹配 > 实参类型向低类型转换后的匹配 > 相容类型转换
编译器会按照这个顺序来确定应该调用哪个重载函数。
函数重载的好处
1、减少了函数名的数量,避免了名字空间的污染,有利于程序的可读性。
2、减少函数调用的复杂性。

递归函数
主要关注点:
1、找出递归关系(递归体)
2、确定递归出口
3、写出递归函数
一般形式

代码展示:


#include
using namespace std;
int add(int a)
{
	if (a)//递归出口,这里意思就是加到a为0的时候为表达式为false
		return(a + add(a - 1));
	else
		return 0;
}
int main()
{
	int n;
	cout << "计算!n" << endl << "n=";
	cin >> n;
	cout << add(n);//进入递归函数
	return 0;
}

运行结果


下一篇: 第九周→