# 函数重载

URL: https://caijiao.org/cpp/function/overload
Source: docs/cpp/function/overload.md
Description: 本节将介绍 C++ 中的函数重载。了解如何通过函数重载实现多个同名函数的不同版本，以及函数重载的使用规则和限制。

在 C++ 中，**函数重载**是指在同一个作用域内，可以定义多个名字相同但参数不同的函数。根据传递给函数的参数类型或个数，编译器会自动选择最匹配的函数。

## 函数重载的规则

1. **参数类型不同**：函数可以有不同类型的参数。
2. **参数个数不同**：函数可以有不同个数的参数。
3. **返回类型不同**：返回类型不能作为重载的唯一区分依据，函数的返回类型不能用来区分不同的重载版本。

### 示例：根据参数个数进行重载

```cpp
#include <iostream>
using namespace std;

// 定义三个重载函数
void print(int a) {
    cout << "整数: " << a << endl;
}

void print(double a) {
    cout << "浮动: " << a << endl;
}

void print(int a, double b) {
    cout << "整数和浮动: " << a << ", " << b << endl;
}

int main() {
    print(10);        // 调用第一个函数
    print(3.14);      // 调用第二个函数
    print(5, 2.71);   // 调用第三个函数
    return 0;
}
````

### 输出：

```
整数: 10
浮动: 3.14
整数和浮动: 5, 2.71
```

### 示例：根据参数类型进行重载

```cpp
#include <iostream>
using namespace std;

// 定义重载函数
void display(int a) {
    cout << "显示整数: " << a << endl;
}

void display(string a) {
    cout << "显示字符串: " << a << endl;
}

int main() {
    display(100);       // 调用整数类型重载
    display("Hello");   // 调用字符串类型重载
    return 0;
}
```

### 输出：

```
显示整数: 100
显示字符串: Hello
```

## 重载的限制

1. **返回类型不可作为重载区分标准**：函数的返回类型不能仅用来区分重载函数。

```cpp
int add(int a, int b) {
    return a + b;
}

double add(int a, int b) {  // 错误：不能仅通过返回类型重载
    return a + b;
}
```

上面的代码是错误的，编译器会报错，因为返回类型不能作为重载函数的区分标准。

2. **参数列表的不同**：重载函数必须在参数的类型或个数上有所不同。仅仅改变参数的名字并不足以区分函数。

```cpp
void display(int x) {
    cout << "整数: " << x << endl;
}

void display(int y) {  // 错误：只是参数名不同，无法重载
    cout << "整数: " << y << endl;
}
```

这个例子也是错误的，因为函数仅通过参数名不同不能实现重载。

## 小结

* 函数重载允许在同一个作用域内定义多个同名函数，它们根据参数类型或个数的不同来进行区分。
* 重载函数不能仅通过返回类型来区分。
* 参数列表的差异是重载的关键，通过改变参数类型或个数来实现。

掌握函数重载的使用，可以使你编写更简洁、灵活的代码。
