C++之重载函数学习
一、C++中的函数重载:
1、函数重载的概念:
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
注意:在c语言中是没有函数重载这个概念的 。
代码示例演示:

文章图片
上面在c++编译器里面编译时没有问题的 , 如果放在c语言编译器里面编译是会报错的:

文章图片
所以说c语言里面不支持函数重载 。
2、函数重载至少要满足下面的一个条件:
参数个数不同
参数类型不同
参数顺序不同
比如下面两个函数可以构造重载函数吗?

文章图片
答案肯定是可以构造重载函数的 , 读者可以自己试试(这个比较好理解) 。
3、当函数默认参数遇上函数重载会发生什么?
例如下面的两个函数:

文章图片
到底会发生啥 , 我们还是看下面这个实验:

文章图片
运行结果:

文章图片
从上面报错的结果里面有一个单词ambiguous(意思是梦棱两可的) , 也就是说默认参数这种使用时不允许的 。
4、C++编译器调用重载函数的准则:
将所有同名函数作为候选者
尝试寻找可行的候选函数:
精确匹配实参
通过默认参数能够匹配实参
通过默认类型转换匹配实参
匹配失败:
最终寻找到的候选函数不唯一 , 则出现二义性 , 编译失败
无法匹配所有候选者 , 函数未定义编译失败
5、函数重载的注意事项:
重载函数在本质上是相互独立的不同函数
重载函数的函数类型不同
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的
代码测试:

文章图片
运行结果:

文章图片
从输出结果我们可以看出这两个函数的入口地址不一样 , 这表明这两个函数是不同的函数 。
6、小结:
【C++之重载函数学习】函数重载是c++中引入的概念
函数重载的本质是相互独立的不同函数
c++中通过函数名和函数参数确定函数调用
二、重载函数进阶学习
1、重载与指针:
下面的函数指针将保存哪个函数的地址?

文章图片
函数重载遇上函数指针:
将宠着你函数名赋值给函数指针时
根据重载规则跳线与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
代码试验:

文章图片
输出结果:

文章图片
从输出结果来看 , 很明显调用了第一个func函数 。
2、注意:
函数重载必然发生在同一个作用域中
编译器需要用参数列表或者函数类型进行函数选择(也就是说碰到指针 , 要注意函数类型了)
无法直接通过函数名得到重载函数的入口地址 , 这里还是通过上面的例子演示一下:

文章图片
输出结果:

文章图片
三、C++和C相互调用:
实际工程中C++和c代码相互调用是不可避免的
c++编译器能够兼容c语言的编译方式
c++编译器会优先使用c++编译的方式
extern关键字能够强制让C++编译器进行c方式的编译:

文章图片
1、下面进行一个c++中调用c函数 , 这里我在当前创建三个文件:add.c、add.h、main.cpp 。 内容分别如下:
add.c内容:

文章图片
add.h内容:
然后我用gcc编译编译生成add.o文件:

文章图片
然后main.cpp里面调用add.c

文章图片
输出结果:

文章图片
结果显示找不到这个函数 , 为了能够在c++里面调用c语言里面的函数 , 我们就要使用刚才上面讲的第四点了;这里我们先用nm命令来查看一下add.o文件里面是否生成符号表(有生成):

文章图片
解决方法 , main.cpp改成:

文章图片
输出结果:

文章图片
2、c中如何调用c++函数:
这里我把main.cpp的内容改成:

文章图片
编译输出:

文章图片
add.c文件内容改成:

文章图片
输出结果:

文章图片
3、如何保证一段c代码只会以c的方式被编译?
解决方法如下:
__cplusplus是c++编译器内置的标准宏定义
__cplusplus的意义 , 确保c代码以统一的c方式被编译成目标文件

文章图片
这里把main.cpp改成:

文章图片
输出结果:

文章图片
4、注意事项
C++编译器不能以c的方式编译重载函数
编译方式决定函数名被编译后的目标名
c++编译方式将函数名和参数列表编译成目标名 , 这里举个例子main.cpp:

文章图片
编译输出:

文章图片
说明ii表示两个参数 , iii表示三个参数
c编译方式只将函数名作为目标名进行编译 , 这里还是以main.cpp为例:

文章图片
输出结果:

文章图片
目标名起冲突所以报错 。
5、小结:
函数重载是c++对c的一个重要升级
函数重载通过参数列表区分不同的同名函数
extern关键字能够实现c和c++的相互调用
编译方式决定符号表中的函数名的最终目标名
推荐阅读
- 人间风物志|游雍和宫:有人说这是北京必打卡景点之一,但我并不觉得非去不可
- 科学探索|揭秘星际物种起源:多个行星孵化器组成“生命之树”
- B社喜加一!《雷神之锤3》限时领取 截止8月21日
- 典韦新星元全面曝光,看完超清高能特效之后,玩家:吃土也要入手
- EVE萌新300问之1:换白蛋要怎么操作?
- 恶魔之魂|数毛社成员表示 PS5次世代独占策略是个明智的选择
- 以家人之名|以家人之名原著小说结局是什么 以家人之名电视剧全集观看地址
- 贺子秋|以家人之名一周更新几集 以家人之名更新时间最新剧情全集观看
- 凌霄|以家人之名凌霄的结局是什么 凌霄最后会和尖尖在一起吗
- 纪录之夜!国米750万锋霸10连杀,决赛国米占优,冠军即将到来
