函数重载要求同名函数在同一作用域内参数列表不同(类型、个数或顺序),返回类型不参与区分;const成员函数可重载;仅返回类型不同或仅默认参数不同不能构成有效重载。

函数重载是C++中允许在同一作用域内定义多个同名函数,但参数列表(类型、个数或顺序)不同的机制。编译器根据调用时传入的实参自动选择最匹配的函数版本,不依赖返回类型区分。
函数重载的关键规则
重载函数必须满足以下条件:
- 函数名相同,且位于同一作用域(如同一个类或命名空间内)
- 参数列表必须不同:可以是参数类型不同、参数个数不同,或参数类型顺序不同(如
void f(int, double)和void f(double, int)) - 返回类型可以不同,但**仅靠返回类型不同不能构成重载**(编译器无法据此判断调用意图)
- const 限定符在成员函数中可参与重载(如 const 成员函数与非 const 版本视为不同函数)
- 默认参数不参与重载判定,若两个函数仅因默认参数导致调用二义性,编译失败
基础重载实例
以下代码演示了基于参数类型和个数的重载:
void print(int x) {
std::cout << "整数: " << x << std::endl;
}
void print(double x) {
std::cout << "浮点数: " << x << std::endl;
}
void print(const char* s) {
std::cout << "字符串: " << s << std::endl;
}
void print(int x, int y) {
std::cout << "两个整数: " << x << ", " << y << std::endl;
}
// 调用示例:
print(42); // 匹配 print(int)
print(3.14); // 匹配 print(double)
print("hello"); // 匹配 print(const char*)
print(1, 2); // 匹配 print(int, int)
容易出错的重载情况
以下写法会导致编译错误或意外行为:
立即学习“C++免费学习笔记(深入)”;
-
仅返回类型不同:
int func();和double func();—— 不合法,编译报错 -
参数仅为 const 修饰(非指针/引用):
void f(int)和void f(const int)—— 视为同一函数,不构成重载 -
顶层 const 对引用/指针的影响:
void g(int&)和void g(const int&)—— 合法重载(底层语义不同) -
与默认参数冲突:
void h(int x)和void h(int x = 0)在同一作用域 —— 编译错误(重复声明)
类中成员函数重载与 const 重载
成员函数可通过 const 限定符实现重载,常用于区分可修改对象与只读对象的访问逻辑:
class Data {
private:
int value_;
public:
Data(int v) : value_(v) {}
// 非 const 版本:允许修改对象
int& get() {
std::cout << "非 const get()\n";
return value_;
}
// const 版本:只能返回 const 引用
const int& get() const {
std::cout << "const get()\n";
return value_;
}};
// 使用:
Data d(10);
const Data cd(20);
d.get() = 99; // 调用非 const 版本,可赋值
int a = cd.get(); // 调用 const 版本,安全读取
重载的核心是让接口更自然,但需避免过度设计。合理使用能提升代码可读性与复用性,滥用则易引发二义性或隐式转换陷阱。实际开发中建议优先考虑参数语义清晰、避免依赖窄类型转换(如 char → int)触发意外匹配。










