前言:
函数重载的意思就是可以有多个同名函数存在,但是这些同名函数的参数列表有着不同情形,以便区分。在C++中,支持在同一作用域下可以声明、定义多个同名函数,但是这些函数的形参类型,类型顺序以及参数个数三者中至少有一个是有区别的。
1、情形一:参数类型不同
既同名函数的形参类型不能相同,代码如下:
#include<iostream>
using namespace std;
//定义两个func同名函数
void func(int x, int y)
{
cout << "func(int x, int y)" << endl;//打印函数
}
void func(double x, double y)
{
cout << "func(double x, double y)" << endl;//打印函数
}
int main()
{
//调用这两个函数
func(2, 3);//系统会自动调用第一个func
func(2.5, 3.5);//系统会自动调用第二个func
return 0;
}
运行结果:
从结果中可以看出,系统会自动识别并调用一个形参类型最为接近的实参类型的函数,尽管有多个和该函数重名的函数,系统也不会报错。
2、情形二:参数个数不同
既同名函数的形参类型可以相同,但是要在形参的个数上有所区分。代码如下:
#include<iostream>
using namespace std;
void func(int x, int y)
{
cout << "func(int x, int y)" << endl;//打印函数
}
void func(int x)
{
cout << "func(int x)" << endl;//打印函数
}
int main()
{
func(2);
return 0;
}
运行结果:
从结果中可以看出,编译器同样会根据形参个数的不同去调用我们期望调用的函数。
3、情形三:参数类型的顺序不同
注意这里指的顺序不同是指第一个形参类型与第二个形参类型的前后顺序,并不是形参名称顺序不同,代码如下:
#include<iostream>
using namespace std;
void func(int x, char y)
{
cout << "func(int x, char y)" << endl;//打印函数
}
void func(char x, int y)
{
cout << "func(char x, int y)" << endl;//打印函数
}
int main()
{
//调用
func(2, 'a');
func('b',3);
return 0;
}
运行结果:
从结果中可以看出,即使同名函数的形参个数和形参类型都相同,只要他们形参类型的顺序不同编译器也可以精确调用。
4、函数返回值不同能否构成函数重载
上文说到了在三个情形下都能构成函数重载,那么如果函数的返回类型不相同按理来说也可以对同名函数进行区分,但是实际上仅仅通过对返回类型的区分是不能够判断是否为函数重载。原因在于编译器在编译完成后会对原本的函数名进行修饰,是根据函数形参、实参的逻辑进行分析然后修饰。然而函数调用的代码是不涉及返回类型的区分,因此修饰的时候不参考函数的返回类型。所以不能通过区分返回类型来构建函数重载。
具体示意图如下:
可以从上图看到,编译器之所以可以区分同名函数,是根据函数的形参、实参进行分析,从而对函数名进行修饰。如果只看调用函数的代码,是看不出要调用函数的返回类型,就无法进行调用函数与定义函数的区分,因此返回类型不被作为修饰参考。
结语:
以上就是关于函数重载的讲解,希望本文可以给你带来更多的收获,如果本文对你起到了帮助,希望可以动动小指头帮忙点赞👍+关注😎+收藏👌!如果有遗漏或者有误的地方欢迎大家在评论区补充~!!谢谢大家!!