【C++】第四章—— 函数重载 Function Overloading 笔记
📌 一、什么是函数重载
函数重载:同一个作用域内可以定义多个 函数名相同、但参数列表不同的函数。
编译器会根据调用时传入的参数个数、类型、顺序进行区分,自动匹配最合适的函数。
✅ 作用:
- 提高代码可读性;
- 让多个相似功能的函数统一名称,接口更简洁;
- 是 C++ 支持“多态”的基础之一(静态多态)。
📚 二、函数重载的条件
✅ 必须不同的有:
- 参数个数不同
- 参数类型不同
- 参数顺序不同(类型顺序)
void print(int a);
void print(double a); // 类型不同
void print(int a, int b); // 参数个数不同
void print(double a, int b); // 类型顺序不同
❌ 不构成重载的情况:
- 仅返回值不同
int sum(int a); // 合法
double sum(int a); // ❌ 不合法:返回值不同但参数完全相同
- 仅参数名不同
int sum(int x); // 合法
int sum(int y); // ❌ 不合法:只是名字不同
🔧 三、函数重载示例
#include <iostream>
using namespace std;void print(int a) {cout << "整型: " << a << endl;
}void print(double a) {cout << "浮点型: " << a << endl;
}void print(string a) {cout << "字符串: " << a << endl;
}int main() {print(10); // 输出:整型: 10print(3.14); // 输出:浮点型: 3.14print("Hello"); // 输出:字符串: Helloreturn 0;
}
🚫 四、与默认参数的冲突
函数重载与默认参数可能导致二义性。
void func(int a);
void func(int a, int b = 10);func(5); // ❌ 二义性:编译器不知调用哪一个
✅ 建议避免重载函数中出现过多默认参数,或设计时注意不冲突。
🧠 五、函数重载 + const 的区分
void show(int a);
void show(const int a); // ❌ 与上函数视为相同,重定义
✅ 但对于 指针/引用 参数,const
可形成重载:
void display(int& x); // 非 const 引用
void display(const int& x); // const 引用,合法重载
🔁 六、函数重载与 inline / static 的关系
inline
和static
不影响重载判断;- 判断重载仅看:参数列表是否不同。
🧱 七、重载构造函数(构造函数重载)
构造函数也可以重载,根据参数不同创建不同初始化方式。
class Box {
public:Box() { cout << "默认构造" << endl; }Box(int l) { cout << "单参数构造: " << l << endl; }Box(int l, int w) { cout << "双参数构造: " << l << ", " << w << endl; }
};int main() {Box b1; // 默认构造Box b2(10); // 单参Box b3(10, 20); // 双参return 0;
}
⚠️ 八、函数模板与重载的优先级
当普通函数与函数模板都能匹配时,优先调用普通函数:
void show(int a) {cout << "普通函数" << endl;
}template<typename T>
void show(T a) {cout << "模板函数" << endl;
}int main() {show(5); // 调用普通函数show(3.14); // 调用模板函数
}
📝 九、小结
项目 | 是否影响重载 |
---|---|
参数个数不同 | ✅ 是 |
参数类型不同 | ✅ 是 |
参数顺序不同 | ✅ 是 |
返回值不同 | ❌ 否 |
参数名不同 | ❌ 否 |
默认参数冲突 | ⚠️ 可能引起二义性 |
const 修饰(非引用) | ❌ 无效 |
const 修饰(引用/指针) | ✅ 有效 |
🎯 建议与实践
- 使用函数重载可以统一接口,增强代码可读性;
- 避免默认参数引起的二义性;
- 对于模板编程,配合重载使用更灵活;
- 若设计多个功能类似函数,考虑重载而非新命名。