在 C++ 中,我们定义的 变量名 和函数名在同一作用域一定是不允许重复的,因此,如果我们需要定义几个功能类似的函数,那么我们必须想办法给它们做不同的命名。
在 C++ 中,允许我们为函数设置同样的名字,但这些函数的参数列表的顺序或者类型必须不一致,这就是 C++ 中的函数重载。
函数重载是 C++ 允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。在 C++ 中不仅函数可以重载,运算符也可以重载。
C++ 代码在编译时会根据参数列表对函数进行重命名,例如 void Swap(int a, int b) 会被重命名为 _Swap_int_int
,void Swap(float x, float y)会被重命名为 _Swap_float_float
。
当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样。
void swap(int *a, int *b);
void swap(float *a, float *b);
void swap(bool *a, bool *b);
我们定义了三个 swap 函数,这三个 swap 函数的形参的类型不一致,但名字一致,因此构成了函数重载。
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;
}
程序运行后,控制台输出如下:
我们定义了四个 Swap 函数,这四个 Swap 函数的参数类型不一致,因此构成了函数重载,最后,在 main 函数我们调用的时候发现,我们传入不同类型的参数,C++ 会自动帮我们调用对应版本的 Swap 函数。
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;
}
程序运行后,控制台输出如下:
这里,我们可以看到,函数的参数个数不一致,同样构成了函数重载。
在 C++ 中,允许我们为函数设置同样的名字,但这些函数的参数列表的顺序或者类型必须不一致,这就是 C++ 中的函数重载。在 C++ 中不仅函数可以重载,运算符也可以重载。