2024年C C++最全C++之函数重载_c++函数重载(1),2024年最新最新BAT大厂面试者整理的C C++面试题目模板

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

int c = Add(a, b);

double x = 3.1;
double y = 4.2;
double z = Add(x, y);

cout << c << endl;
cout << z << endl;

system("pause");
return 0;

}


输出:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629091804598.png)  
 **上面两个函数,函数1和函数2构成函数重载。在函数调用时,编译器会自动根据函数参数类型的不同调用与之匹配的函数。**  
 但是函数重载与返回值无关:



int Add(short x, short y){
return x + y;
}
short Add(short x, short y){
return x + y;
}


此时不够成重载,会有以下报错信息。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629092440721.png)


## 二.C++怎么实现函数重载


* 为什么C++支持函数重载而C语言不支持函数重载呢?这还要从程序的运行说起,
* 程序运行要经过4个阶段:**预处理,编译,汇编,链接**
* 这里帮助复习一下这四个阶段实现的功能:



> 
> 预处理:头文件展开,宏替换,去注释和条件编译,形成.i文件  
>  编译:检查语法错误,将c语言转化为汇编语言,形成.s文件  
>  汇编:将汇编语言转化为机器语言。(二进制语言)形成.o目标文件  
>  链接:将目标文件与标准库链接起来,形成.exe可执行文件。
> 
> 
> 


* 在实际的项目中,可能存在多个源文件和头文件。当在一个源文件中调用一个函数,而这个函数的定义在另一个源文件中时,在编译时不会发生有语法错误,但是在目标文件中,在调用源文件中不会有调用函数的地址,此时要通过链接,到别的目标文件的符号表中找改函数的地址,然后链接到一起。
* 但是在链接时,链接器会通过什么名字去找呢?
* 下面是C语言上面函数的符号表中的命名:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629100917257.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NzAyMzM0Nw==,size_16,color_FFFFFF,t_70)
* **在c语言中,函数的符号表命名是直接用函数面直接修饰的。**


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629101032608.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NzAyMzM0Nw==,size_16,color_FFFFFF,t_70)


* **但是在c++中,windows下函数的命名规则不是直接用函数名直接命名的,并且发现两函数的命名不同**
* 当在linux下,采用g++的函数修饰更加明显。
* int Add(int x,int y)会被命名为\_Z3Addii
* int Add(int x,int y)会被命名为\_Z3Adddd
* 其命名规则是【\_Z+函数名长度+函数名+类型首字母】


**总结:在C语言中函数定义的符号表中直接使用的是函数名,当函数名相同时,链接就不知道链接哪一个函数了。但是在C++中,函数定义符号表函数命名有一定的规则。\_Z+函数名长度+函数名+类型首字母(从左到右),其中无返回值。所以C++中函数名相同时,参数的类型,顺序,个数不同可以构成函数重载,与返回值无关!**


## 三.extern"c"


* 有些时候C++工程项目中需要将某些函数按照C的风格编译,在函数前加extern “C”,意思时告诉编译器改函数用c的规则来编译。
* 个人理解:就是一个函数定义用C的方式定义的,但是在C++中要调用这个函数,于是在声明时加一个extern “C”,告诉编译器用C的方式去找这个函数。为什么可以用C 的方式找,因为C++兼容C。
* 如果一个函数是用C++的方式定义的,如果C语言中要调用它,在函数声明时加一个extern “C”,告诉编译器用C的方式去找这个函数。


例如:我在一个源函数中调用以函数,但是子在一cpp源文件中我用extern “C"声明这个函数,在另一个cpp源文件中定义这个函数。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629103431158.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NzAyMzM0Nw==,size_16,color_FFFFFF,t_70)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629103445830.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NzAyMzM0Nw==,size_16,color_FFFFFF,t_70)  
 此时编译会报一个错误:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629103529413.png)  
 这里是因为,两个都是CPP文件,Add函数在定义处使用的是CPP的命名规则,但是,声明处用extern"C”,在调用时会用C的命名规则去找Add函数,此时会找不到。  
 有一种解决办法就是在Add函数定义的源文件后缀改为.c用c语言的命名方式命名。  
 一般会这样使用:



//写法一
#ifdef __cplusplus//如果是cpp文件,就用C的规则找
extern “C”{

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

如果你需要这些资料,可以戳这里获取

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值