C++ | C++函数的重载

C++函数的重载

C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载Function Overloading)。
借助重载,一个函数名可以有多种用途。

实例1:

/*******************************************************************
* > File Name: classOverload.cpp
* > Create Time: 2021年09月13日 14:58:36
******************************************************************/
#include <iostream>
using namespace std;

void Swap(int a, int b)
{
cout << "a = " << a << ", b = " << b << endl;
int c;
c = a;
a = b;
b = c;
cout << "a = " << a << ", b = " << b << endl;
}

void Swap(char a, char b)
{
cout << "a = " << a << ", b = " << b << endl;
char c;
c = a;
a = b;
b = c;
cout << "a = " << a << ", b = " << b << endl;
}

void Swap(double a, double b)
{
cout << "a = " << a << ", b = " << b << endl;
double c;
c = a;
a = b;
b = c;
cout << "a = " << a << ", b = " << b << endl;
}

void Swap(bool a, bool b)
{
cout << "a = " << a << ", b = " << b << endl;
bool c;
c = a;
a = b;
b = c;
cout << "a = " << a << ", b = " << b << endl;
}

int main(void)
{
Swap(100, 1000);

Swap('a', 'b');

Swap(12.5, 33.5);

Swap(true, false);

return 0;
}

编译、运行:

PS E:\fly-prj\cplusplus\day11> make 
g++ -o classOverload classOverload.cpp -g -Wall
PS E:\fly-prj\cplusplus\day11> .\classOverload.exe
a = 100, b = 1000
a = 1000, b = 100
a = a, b = b
a = b, b = a
a = 12.5, b = 33.5
a = 33.5, b = 12.5
a = 1, b = 0
a = 0, b = 1

注意,参数列表不同包括参数的个数不同、类型不同或顺序不同,仅仅参数名称不同是不可以的。函数返回值也不能作为重载的依据。

函数的重载的规则:

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

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

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

当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。

不同的编译器有不同的重命名方式,这里仅仅举例说明,实际情况可能并非如此。

从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样。