C++支持在同一作用域中出现同名的函数,但要求函数的参数不同,可以是参数类型不同或者个数不同。这样C++调用就表现出了多态行为,使用更加灵活。C语言是不支持同一作用域中出现同名函数的。
参数个数不同构成重载

我们创建一个同名函数,当我们的函数参数个数不同时,可以构成重载函数,两个函数就都可以成功调用。
参数类型顺序不同构成重载

可以看到,我们构造的函数 fun2 ,一个参数类型为 int 一个为 double ,构成重载函数正常运行。

可以看到,同名函数参数类型相同,顺序不同依然可以构成重载。
返回值不同不能构成重载

可以看到,当我们想要构造不同返回值函数重载时,会发生报错:无法重载仅按返回类型区分的函数。
原因:试想一下,我们调用函数时不会加上返回值类型调用函数,这样会导致当我们调用同名函数时,无法区分调用的是无返回值还是有返回值类型的函数,导致出错。
注意
当我们使用缺省参数时,函数重载成功吗?

显而易见,答案是不能成功,和上面的原因一样,这样会导致编译器无法区分调用的是有缺省参数的函数还是无缺省参数的函数,而导致出错。
有些同志或许会想到可以使用命名空间来解决这一不能重载的情况,可是还记得文章开头的那段函数重载的定义吗?当我们使用命名空间把其中之一用另一个域包含起来时,便使得两个同名函数处于不同的作用域,从而不构成函数重载。

本文介绍结束,感谢大家支持。
下面是测试代码(博主使用的VS2022):
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
void fun1() //无参函数
{
cout << "fun1()";
}
void fun1(int a) //有一个参数的函数
{
cout << " fun1(int a)";
}
void fun2(int a,int b)
{
cout << "fun2(int a,int b)";
}
void fun2(double a, double b)
{
cout << "fun2(double a,double b)";
}
void fun3(int a, char b)
{
cout << "fun3(int a,char b)";
}
void fun3(char b, int a)
{
cout << "fun3(char b,int a)";
}
//void fun4()
//{
// cout << "void类型";
//}
//int fun4()
//{
//
//
// cout << "int类型";
// return 1;
//}
namespace yu{
void fun5(int a)
{
cout << "无缺省参数"<<endl;
}
}
void fun5(int a = 1)
{
cout << "有缺省函数"<<endl;
}
int main() {
fun5();
yu::fun5(5);
//fun4();//无法区分是调用int返回类型还是void返回类型的函数
//函数参数顺序不同构成重载
//fun3(1, 'x');
//fun3('x', 1);
//函数参数类型不同构成重载
//fun2(1, 2);
//fun2(1.1, 2.2);
//fun1(); //调用无参函数
//fun1(1); //调用有参函数
return 0;
}
3807

被折叠的 条评论
为什么被折叠?



