# C++ 中的函数重载

> 原文： [https://beginnersbook.com/2017/08/cpp-function-overloading/](https://beginnersbook.com/2017/08/cpp-function-overloading/)

函数重载是 [C++ 编程](https://beginnersbook.com/2017/08/c-plus-plus-tutorial-for-beginners/)的一个特性，它允许我们有多个具有相同名称但不同参数列表的函数，当我说参数列表时，它表示参数的数据类型和顺序，例如函数`myfuncn(int a, float b)`的参数列表是`(int, float)`，它与函数`myfuncn(float a, int b)`参数列表`(float, int)`不同。函数重载是[编译时多态](https://beginnersbook.com/2017/08/cpp-polymorphism/)。

现在我们知道什么是参数列表，让我们看一下重载规则：我们可以在同一范围内拥有以下函数。

```cpp
sum(int num1, int num2)
sum(int num1, int num2, int num3)
sum(int num1, double num2)

```

> 记住这条规则的最简单方法是参数应符合以下任何一个或多个条件，它们应具有不同的**类型**，**数量**或**顺序**的参数。

**例如：**

这两个函数有不同的参数**类型**：

```cpp
sum(int num1, int num2)
sum(double num1, double num2)
```

这两个的**参数数量**不同：

```cpp
sum(int num1, int num2)
sum(int num1, int num2, int num3)

```

这两个有不同的**参数顺序**：

```cpp
sum(int num1, double num2)
sum(double num1, int num2)
```

以上三种情况都是有效的重载情况。我们可以有任意数量的函数，只需记住参数列表应该是不同的。例如：

```cpp
int sum(int, int)
double sum(int, int)
```

由于参数列表相同，因此不允许这样做。尽管它们具有不同的返回类型，但它无效。

## 函数重载示例

让我们举一个例子来理解 C++ 中的函数重载。

```cpp
#include <iostream>
using namespace std;
class Addition {
public:
    int sum(int num1,int num2) {
        return num1+num2;
    }
    int sum(int num1,int num2, int num3) {
       return num1+num2+num3;
    }
};
int main(void) {
    Addition obj;
    cout<<obj.sum(20, 15)<<endl;
    cout<<obj.sum(81, 100, 10);
    return 0;
}
```

**输出：**

```cpp
35
191
```

## 函数重载例 2

正如我在本指南开头所提到的，具有不同返回类型和相同参数列表的函数不能重载。但是，如果函数具有不同的参数列表，则它们可以具有相同或不同的返回类型，以便有资格进行重载。简而言之，函数的返回类型在函数重载中不起任何作用。重要的是函数的参数列表。

```cpp
#include <iostream>
using namespace std;
class DemoClass {
public:
    int demoFunction(int i) {
        return i;
    }
    double demoFunction(double d) {
        return d;
    }
};
int main(void) {
    DemoClass obj;
    cout<<obj.demoFunction(100)<<endl;
    cout<<obj.demoFunction(5005.516);
   return 0;
}
```

**输出：**

```cpp
100
5006.52
```

## 函数重载的优点

函数重载的主要优点是提高**代码可读性**并允许**代码可重用性**。在示例 1 中，我们已经看到我们如何能够为具有不同参数的相同任务（添加）提供多个函数，这允许我们相加两个整数以及三个整数，如果我们希望我们可以创建一些具有相同名称和四个或五个参数的函数。

想象一下，如果我们没有函数重载，我们要么只能相加两个整数，要么为同一个任务添加编写不同的名称函数，这会降低代码的可读性和可重用性。