C++函数重载

C++函数重载教程

C++ 中,我们定义的 变量名 和函数名在同一作用域一定是不允许重复的,因此,如果我们需要定义几个功能类似的函数,那么我们必须想办法给它们做不同的命名。

C++ 中,允许我们为函数设置同样的名字,但这些函数的参数列表的顺序或者类型必须不一致,这就是 C++ 中的函数重载。

函数重载实现

定义

函数重载是 C++ 允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。在 C++ 中不仅函数可以重载,运算符也可以重载。

函数重载规则

  1. 函数名称必须相同。
  2. 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
  3. 函数的返回类型可以相同也可以不相同。
  4. 仅仅返回类型不同不足以成为函数的重载。

C++是如何做到函数重载

C++ 代码在编译时会根据参数列表对函数进行重命名,例如 void Swap(int a, int b) 会被重命名为 _Swap_int_int,void Swap(float x, float y)会被重命名为 _Swap_float_float

当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样。

C++函数重载详解

语法

void swap(int *a, int *b); void swap(float *a, float *b); void swap(bool *a, bool *b);

说明

我们定义了三个 swap 函数,这三个 swap 函数的形参的类型不一致,但名字一致,因此构成了函数重载。

案例

C++函数重载详解

C++ 函数重载使用

#include <iostream> using namespace std; // 交换 char 变量的值 void Swap(char *a, char *b) { cout << "Call Swap Char" << endl; char temp = *a; *a = *b; *b = temp; } // 交换 int 变量的值 void Swap(int *a, int *b) { cout << "Call Swap Int" << endl; int temp = *a; *a = *b; *b = temp; } // 交换 float 变量的值 void Swap(float *a, float *b) { cout << "Call Swap Float" << endl; float temp = *a; *a = *b; *b = temp; } // 交换 bool 变量的值 void Swap(bool *a, bool *b) { cout << "Call Swap Bool" << endl; char temp = *a; *a = *b; *b = temp; } int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; char c1 = 'a', c2 = 'b'; Swap(&c1, &c2); int n1 = 100, n2 = 200; Swap(&n1, &n2); float f1 = 100.123, f2 = 200.123; Swap(&f1, &f2); return 0; }

程序运行后,控制台输出如下:

19_C函数重载.png

我们定义了四个 Swap 函数,这四个 Swap 函数的参数类型不一致,因此构成了函数重载,最后,在 main 函数我们调用的时候发现,我们传入不同类型的参数,C++ 会自动帮我们调用对应版本的 Swap 函数。

C++函数重载

C++ 中函数重载

#include <iostream> using namespace std; int sum(int num1) { cout << "Call Sum1" << endl; int ret = 0; for(int i = num1; i <= 100; i++) { ret += i; } return ret; } int sum(int num1, int sum2) { cout << "Call Sum2" << endl; int ret = 0; for(int i = num1; i <= sum2; i++) { ret += i; } return ret; } int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; int num1 = 1; int num2 = 1024; int ret1 = sum(num1, num2); int ret2 = sum(num1); cout << "ret1 = " << ret1 << ", ret2 = " << ret2 << endl; return 0; }

程序运行后,控制台输出如下:

20_C函数重载.png

这里,我们可以看到,函数的参数个数不一致,同样构成了函数重载。

C++函数重载总结

在 C++ 中,允许我们为函数设置同样的名字,但这些函数的参数列表的顺序或者类型必须不一致,这就是 C++ 中的函数重载。在 C++ 中不仅函数可以重载,运算符也可以重载。