C++ 中的函数重载
C++ 函数重载(Function Overloading)是一种允许在同一作用域内定义多个同名但参数列表不同的函数的特性。通过函数重载,可以用同一个函数名实现相似但功能不同的操作,提高代码的可读性和灵活性。
一、核心概念
- 函数名相同:所有重载的函数使用相同的名称。
- 参数列表不同:参数的类型、数量或顺序必须至少有一项不同。
- 返回值类型不参与重载:仅返回值不同的函数不能重载(会导致编译错误)。
示例代码
以下是一个简单的函数重载示例:
#include <iostream>
#include <string>// 重载函数:计算整数和
int add(int a, int b) {std::cout << "调用 int add(int, int)" << std::endl;return a + b;
}// 重载函数:计算双精度浮点数和
double add(double a, double b) {std::cout << "调用 double add(double, double)" << std::endl;return a + b;
}// 重载函数:连接字符串
std::string add(const std::string& a, const std::string& b) {std::cout << "调用 string add(string, string)" << std::endl;return a + b;
}int main() {std::cout << add(1, 2) << std::endl; // 调用 int add(int, int)std::cout << add(1.5, 2.5) << std::endl; // 调用 double add(double, double)std::cout << add("Hello", " World") << std::endl; // 调用 string add(string, string)return 0;
}
二、函数重载的匹配规则
当调用重载函数时,编译器会根据传入的实参类型选择最合适的重载版本:
- 精确匹配:优先选择参数类型完全一致的函数。
- 隐式转换匹配:如果没有精确匹配,则尝试通过隐式类型转换(如
int
→double
)找到匹配函数。 - 报错:如果存在多个可能的匹配(歧义),则编译错误。
示例:
void func(int x); // 版本1
void func(double x); // 版本2func(5); // 精确匹配版本1(int)
func(5.5); // 精确匹配版本2(double)
func('A'); // 通过隐式转换匹配版本1(char → int)
注意事项
-
参数类型的区别:
void func(int x); // 合法 void func(int& x); // 合法(参数类型不同:值传递 vs 引用传递) void func(const int& x); // 合法(参数类型不同:普通引用 vs 常量引用)
-
仅返回值不同无法重载:
int func(int x); // 错误:与下面的函数冲突 double func(int x); // 编译错误!仅返回值不同
-
默认参数与重载冲突:
void func(int x, int y = 0); // 有默认参数 void func(int x); // 错误:与上面的函数冲突(调用 func(1) 时存在歧义)
三、函数重载的应用场景
- 功能相似但参数不同:如计算不同类型数据的和、平均值等。
- 提高代码可读性:避免使用多个相似但不同名的函数(如
addInt
、addDouble
)。 - 类的构造函数重载:根据不同参数初始化对象的不同状态。
class Point {
public:Point(); // 默认构造函数Point(int x, int y); // 带参数的构造函数
};
四、总结
函数重载是 C++ 多态性的一种体现,通过参数列表的差异让同名函数实现不同功能。合理使用重载可以使代码更简洁、更易维护,但需注意避免歧义,确保编译器能正确区分重载函数。