今天我们来谈谈C++的函数重载😊😊😊,对于函数重载,我们首先需要理解几个问题:
- 1、什么是函数重载 ?
- 2、函数重载需要注意什么 ?
- 3、为什么C语言不支持函数重载,而C++支持 ?
接下来我们将会对此进行一一讲解
浅谈C++的函数重载——三个问题
- 一、什么是函数重载?
- 二、函数重载需要注意什么?
- 三、为什么C语言不支持函数重载,而C++支持 ?
一、什么是函数重载?
对于一组函数,在其函数名都相同、参数列表的数目或类型不同的前提下,加上它们都属于同一个作用域中,那么我们就可以把它们称作函数重载。即,如下常见的比较重载函数,分别用于int
、double
、const char*
之间的大小比较
bool compare(int a, int b) //compare_int_int
{
cout << "compare_int_int" << endl;
return a > b;
}
bool compare(double a, double b) //compare_double_double
{
cout << "compare_double_double" << endl;
return a > b;
}
bool compare(const char* a, const char* b) //compare_char*_char*
{
cout << "compare_char*_char*" << endl;
return a > b;
}
二、函数重载需要注意什么?
- 声明的位置: 编译器会优先在离函数调用点最近的作用域寻找是否有对应函数的声明,一旦找到则会立即调用该函数,如若我们在全局范围内定义了相关函数重载的内容,同时又在即将调用重载函数的局部作用域中声明了同名、同参数列表的函数声明,编译器则会之间使用局部作用域的函数声明,而忽略了之前我们在全局范围写的
... compare(int a, int b)
... compare(double a, double b)
... compare(const char* a, const char* b)
int data = 10;
int main()
{
int data = 10;
int a = ::data; //作用域不同
bool compare(int a, int b); //函数声明
compare(10, 2);
compare(1.0, 2.0);
compare("aaa", "bbb");
//编译器在离他最近的作用域找是否有函数的声明,一旦找到,就直接调用
return 0;
}
假如我们直接在全局写两个函数重载,一个参数为const int
,另一个为int
;获取将它们换为一个参数为const int*
,另一个为int*
,会发生什么???🤔🤔(这里涉及到const 和 volatile 对形参的影响,以后再讲)
void func(int a) {} //int 符号一模一样
void func(const int a) {} //int
int main()
{
int a = 10; const int b = 10;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
return 0;
}
这里还涉及到一个问题:C++与C语言代码之间是不能够随意调用的,放在下面(第三点)讲
三、为什么C语言不支持函数重载,而C++支持 ?
- C语言在生成函数符号时,只有函数名决定,若出现多个函数名相同的情况,会导致链接错误
- 而C++代码在产生函数符号时,由函数名名和参数列表决定,由不同的参数列表而来的函数符号各不相同,因此C++语言支持函数重载,同时也因为这个,仅仅是靠返回值不同的函数不能称作重载函数
情况一:C++调用C代码,需要使用
extern "C"
将函数声明括起来,这是为了使之以C语言的规则来生成函数符号,防止出现无法解析的外部符号 "int __cdecl sum(int,int)" (? sum@@YAHHH@Z),函数 main 中引用了该符号
在使用了
extern "C"
后
情况二:C语言调用C++代码(有人可能会问,同样在C语言中使用
extern
,但其关键字是C++里面的,它不可在C语言中出现,那么我们需要得把它的定义写在extern "C"
里)
实际上,我们可以通过一个预处理指令 #ifdef
来处理C代码和C++代码之间调用可能会出现的问题,如下代码所示:
#ifdef __cplusplus //C++文件
extern "C" {
#endif
int sum(int a, int b)
{
return a + b;
}
#ifdef __cplusplus //C++文件
}
#endif
如若是C++代码文件,则会将整段代码执行一遍,按C语言的标准来生成函数符号;如若是C代码文件,则直接定义相关函数即可。这里就实现了C++与C语言之间通用的代码调用
🌻🌻🌻以上就是有关浅谈C++的函数重载的内容,如果聪明的你浏览到这篇文章并觉得文章内容对你有帮助,请不吝动动手指,给博主一个小小的赞和收藏 🌻🌻🌻