C++基础-函数重载
函数重载
一组函数,函数名相同,参数列表个数或类型不同,那么这一组函数称作函数重载
C++为什么支持函数重载,C语言不支持函数重载
- 编译器编译代码产生符号的规则是不同的:
- C++代码产生函数符号的时候,是函数名+参数列表类型组成的
- C代码产生函数符号时,只由函数名决定
- 如果把此cpp 代码放入c中 会产生编译链接错误
函数重载需要注意
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_const char*_const char*
cout<<"compare_char*_char*"<<endl;
return strcmp(a,b)>0;
}
int data = 10;
int main(int argc, char const *argv[])
{
int data = 20;
int a = ::data; //全局作用域的data
//在函数中局部声明另一个函数
bool compare(int a, int b);
compare(10,20);
compare(10.0,20.0); //double => int
compare("aaa","bbb"); //const char* => int ??
return 0;
}
我们在全局有三个函数的定义,在main()中局部声明一个函数,调用时会就近采用当前作用域的声明,因此在上述情况下,不在同一个作用域就谈不上重载
一组函数要称得上重载,一定是先处在同一个作用域当中的
const或者volatile的时候, 是怎么影响形参类型的
volatile : 解决多线程程序内存可见性的一个必不可少的关键字
#include <typeinfo> //获取类型信息
void func(int a){}
//void func(const int a){} //const int与 int 属于同一函数参数
void func(int *a){}
//void func(int *const a){} //同一函数
void func(int const* a){} //不同函数
int main(int argc, char const *argv[])
{
int a = 10;
const int b = 10;
cout<<typeid(a).name()<<endl; //int
cout<<typeid(b).name()<<endl; //int
return 0;
}
注意:
一组函数,函数名相同,参数列表也相同,仅仅是返回值不同不叫重载(符号是依据函数名+形参列表决定的,生成符号和返回值没有关系)
面试题:请解释一下什么是多态?
一个事物的多种形态
静态多态(编译时):函数重载(编译时生成指令时,需要经过实参的入栈,call函数)
动态多态(运行时):虚函数
C++和C语言代码之间互相调用
C++ 调用 C
//test.c
int sum(int a, int b)// sum .text
{
return a+b;
}
//test.cpp
//无法解析外部符号 C++生成的符号无法匹配C生成的符号的定义
int sum(int a, int b); //sum_int_int "UND"
int main(int argc, char const *argv[])
{
int ret = sum(10,20);
return 0;
}
结论:无法直接调用
解决方法:把C函数声明扩在 extern "C" 里面
extern "C"{ //以C语言规则生成符号,链接的时候就可以找到test.c符号定义
int sum(int a, int b);
}
C 调用 C++
反过来同样,无法直接调用,因为符号不匹配
解决方法:把C++函数定义扩在 extern "C" 里面, 按照C语言规则生成
extern "C"{
int sum(int a, int b)// sum_int_int .text
{
return a+b;
}
}
灵活的函数定义
//只要是C++编译器, 都内置了__cplusplus这个宏名
#ifdef __cplusplus //在CPP中宏生效,这个函数是按C规则生成
extern "C"{
#endif
//如果用C编译器,不认识__cplusplus这个宏,直接生成的就是C符号
int sum(int a, int b)// sum_int_int .text
{
return a+b;
}
#ifdef __cplusplus
}
#endif
因此这样写,不管什么编译器,在C中都是可以直接调用
本文作者:言叶以上
本文链接:https://www.cnblogs.com/anqwjoe/p/16474702.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步