c++的函数重载
1.在C++ 中,函数重载是指在同一个作用域内,可以定义多个同名的函数,但这些函数的参数列表(参数的类型、个数或顺序)必须不同。编译器会根据函数调用时提供的实际参数来确定具体调用哪个重载函数。例如:
#include <iostream>
// 计算两个整数的和
int add(int num1, int num2)
{
return num1 + num2;
}
// 计算两个浮点数的和
float add(float num1, float num2)
{
return num1 + num2;
}
// 计算三个整数的和
int add(int num1, int num2, int num3)
{
return num1 + num2 + num3;
}
int main()
{
std::cout << add(5, 3) << std::endl; // 调用两个整数参数的add函数
std::cout << add(2.5f, 3.5f) << std::endl; // 调用两个浮点数参数的add函数
std::cout << add(1, 2, 3) << std::endl; // 调用三个整数参数的add函数
return 0;
}
在上述代码中,定义了三个名为 add 的函数,它们的参数类型和个数不同,通过函数重载,实现了根据不同的参数来执行不同的加法操作。
需要注意的是,函数重载与函数的返回值类型无关,仅根据参数列表来区分不同的重载函数。如果两个函数仅有返回值类型不同,而参数列表相同,则不能构成函数重载,这会导致编译错误。
2.函数重载的底层原理
函数重载的底层原理主要依赖于编译器的编译机制。在编译阶段,编译器会根据函数的参数类型、个数和顺序来为每个重载函数生成一个唯一的内部标识(根据函数名修饰规则)。当程序中出现函数调用时,编译器会根据传入的实际参数来匹配对应的重载函数,并生成正确的调用代码。这个过程是在编译时完成的,属于静态绑定,即编译器在编译期间就确定了要调用的具体函数。
函数名修饰规则
函数名修饰是编译器用来区分不同函数的一种方式,不同的编译器有不同的函数名修饰规则,但通常都会包含函数名、参数类型和其他相关信息。以常见的C++ 编译器为例,通常会将函数的参数类型编码到函数名中。例如,对于函数 int add(int a, int b) 和 float add(float a, float b) ,编译器可能会将它们修饰为类似 _Z3addii 和 _Z3addff 的形式,其中 _Z 是常见的前缀, 3 表示函数名 add 的长度,后面的 ii 和 ff 分别表示参数类型为 int 和 float 。对于类的成员函数,还会包含类名等信息,以区分不同类中的同名函数。
函数名修饰后的结果在目标文件中是唯一的,这样链接器在链接阶段就能够根据函数名修饰来准确地找到函数的定义,实现函数的正确链接和调用。
喜欢我就点点关注吧