在有的情境下我们需要实现几个功能相似的函数,可能只有细节上有区别。比如求两个数的和,这两个数有多重类型,可能是int,float,double,char,bool等。如果在C语言中我们往往需要设计多个不同名称的函数。例如:
int Add1(int a, int b); //求两个int类型的数之和
float Add2(float a, float b); //求两个float类型的数之和
char Add3(char a, char b); //求两个char类型的数之和
但在C++中,这完全没有必要。C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloading)。借助重载,一个函数名可以有多种用途。
函数重载的前提:必须在相同的作用域
函数重载的条件:名字必须相同、参数列表一定不同(个数、类型、类型次序),返回值类型是否相同没有关系
函数的重载的规则:
- 函数名称必须相同。
- 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
- 函数的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为函数的重载。
【示例】借助函数重载交换不同类型的变量的值:
#include <iostream>
using namespace std;
//交换 int 变量的值
void Swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//交换 float 变量的值
void Swap(float *a, float *b)
{
float temp = *a;
*a = *b;
*b = temp;
}
//交换 char 变量的值
void Swap(char *a, char *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
//交换 bool 变量的值
void Swap(bool *a, bool *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
int main()
{
//交换 int 变量的值
int n1 = 100, n2 = 200;
Swap(&n1, &n2);
cout << n1 << ", " << n2 << endl;
//交换 float 变量的值
float f1 = 12.5, f2 = 56.93;
Swap(&f1, &f2);
cout << f1< < ", " << f2 << endl;
//交换 char 变量的值
char c1 = 'A', c2 = 'B';
Swap(&c1, &c2);
cout << c1 << ", " << c2 << endl;
//交换 bool 变量的值
bool b1 = false, b2 = true;
Swap(&b1, &b2);
cout << b1 << ", " << b2 << endl;
return 0;
}
C++ 是如何做到函数重载的,为什么C语言不可以
函数在编译的时候会对函数名重新修饰,C语言的名字修饰规则非常简单,只是在函数名字前面添加了下划线。比如,对于以下代码,在最后链接时就会出错
而函数在C++编译时名称修饰比较复杂,语言不好描述,可以看以下图片。
思考:
void fun(int a = 10){}
void fun(int a){}
会形成函数重载吗???????