👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨
前言
本章是补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。
目录
- 前言
- 一、函数重载的概念
- 二、例举重载函数例子
- 三、**分析为什么C++有函数重载而C语言没有
- 五、总结
一、函数重载的概念
C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型或者类型顺序)不同,返回值没有要求。常用来处理实现功能类似数据类型不同的问题
二、例举重载函数例子
- 参数类型不同
周所周知,C语言是不允许出现同名函数;而C++中的函数重载j就可以来处理实现功能类似数据类型不同的问题
- 参数个数不同
- 参数类型顺序不同
- 函数的返回值不同
首先函数重载与函数的返回值无关
- 函数缺省值不同
首先以上代码是一个重载函数,只是函数
func()
的调用存在歧义。因为func()
可以调用void func()
,也可以调用缺省参数void func(int a = 1)
,对于缺省参数,如果没有传参,默认使用缺省参数值。
三、**分析为什么C++有函数重载而C语言没有
为什么c++可以函数重载而c就不可以呢?这就跟函数名修饰规则有关了。
由于vs修饰规则过复杂,而Linux下的gcc、g++编译器的修饰规则简单易懂。因此下面用gcc、g++来演示过程。(gcc是Linux下的c语言编译器,g++是LInux下的c++编译器)
- 首先在Linux下编写
test.c
,其内容如下:
vim test.c
- 首先用
gcc
来编译test.c
文件(gcc是Linux下的C语言编译器)
果然在我们的预料中,C语言环境下发生了编译错误。接下来我们可以使用objdump(反汇编)
来查看目标文件或者可执行的目标文件的构成。为了能让文件编译通过,我们修改文件内容如下:
紧接着用gcc
编译test.c
文件,生成了a.out
的可执行文件,然后再用objdump -S a.out
来查看目标文件或者可执行的目标文件的构成
如下图所示,C语言的函数名存储是直接转化使用函数名;C语言的格式:就是函数名,转化都是add,两者相同,所以不支持函数重载
- 然后再用
g++
来编译先前的test.c
文件,我们发现是可以编译的过的
最后,再用objdump -S a.out
来查看目标文件或者可执行的目标文件的构成,如下图所示
所以,在C++中,只要形参列表(参数个数 或 类型 或 顺序) 不同,修饰后的函数名也就不同。那么在链接时,就不会因名字冲突而找不到对应地址。因此,C++是支持函数重载的。
五、总结
- 函数重载需要满足参数个数、类型或者类型顺序不同,注意:其返回值没有要求。
- C语言不支持就是因为直接转化函数名,C++支持是因为函数名修饰规则。