C++ 函数重载
一、什么是函数重载
同一个作用域下,函数名相同,但参数列表不同,构成函数重载。
简单说:同名不同参,就是重载。
二、构成重载的条件(必记)
满足下面任意一种就算重载:
参数个数不同
参数类型不同
参数顺序不同(不同类型参数调换顺序)
⚠️ 不算重载的情况
-
只有返回值不同,不算重载
-
只有参数名不同,不算重载
-
加缺省参数造成歧义,不算合法重载
三、基础代码示例 1:参数个数不同
#include <iostream>
using namespace std;
// 两个同名函数,参数个数不一样
void print(int a)
{
cout << "一个整数:" << a << endl;
}
void print(int a, int b)
{
cout << "两个整数:" << a << " " << b << endl;
}
int main()
{
print(10);
print(10, 20);
return 0;
}
运行结果:
一个整数:10
两个整数:10 20
编译器根据你传的参数个数自动匹配对应函数。
四、代码示例 2:参数类型不同
#include <iostream>
using namespace std;
void show(int x)
{
cout << "整型版本:" << x << endl;
}
void show(double x)
{
cout << "浮点版本:" << x << endl;
}
int main()
{
show(66);
show(3.14);
return 0;
}
运行结果:
整型版本:66
浮点版本:3.14
同函数名,参数类型不一样,构成重载。
五、代码示例 3:参数顺序不同(不同类型)
#include <iostream>
using namespace std;
void fun(int a, double b)
{
cout << "int 在前,double 在后\\n";
}
void fun(double a, int b)
{
cout << "double 在前,int 在后\\n";
}
int main()
{
fun(10, 3.14);
fun(3.14, 10);
return 0;
}
运行结果:
int 在前,double 在后
double 在前,int 在后
类型顺序不同,也构成重载。
六、重点坑点 1:只有返回值不同,不构成重载
错误代码(编译报错)
#include <iostream>
using namespace std;
// 只改返回值,参数完全一样,不叫重载
int getNum()
{
return 1;
}
double getNum()
{
return 3.14;
}
int main()
{
// 编译器不知道调用哪个
getNum();
return 0;
}
记住:返回值不能作为重载依据。
七、重点坑点 2:参数名不同不算重载
// 完全一样,只是参数名字不一样,不是重载
void f(int a);
void f(int b);
编译器认为是重复定义,直接报错。
八、重点坑点 3:函数重载 + 缺省参数 产生歧义
#include <iostream>
using namespace std;
void test(int a)
{
cout << "test(int)\\n";
}
// 带缺省参数
void test(int a, int b = 10)
{
cout << "test(int,int)\\n";
}
int main()
{
// 报错!二义性
// 既可以调用 test(int),也可以 test(5,默认值)
test(5);
return 0;
}
结论:重载尽量别和缺省参数混用,容易歧义。
九、函数重载匹配规则(编译器怎么选)
严格匹配:参数类型、个数完全一致,优先调用
隐式类型转换匹配(int→double 等)
都匹配不上 → 编译报错
十、总结一句话背下来
函数重载:同作用域、同名、参数列表不同
参数不同分三种:个数、类型、类型顺序
返回值、参数名 不能当重载条件
重载和缺省参数容易产生二义性,尽量避开
编译器靠实参的个数和类型自动匹配函数



![P11246 [GESP202409 六级] 小杨和整数拆分-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108100631-6af049a75855c-220x150.png)

