概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。
也就说在同一作用域下通过名称相同,参数不同实现函数的区分。
底层实现
c++名字修饰规则:
- 实际我们的项目通常是由多个头文件和多个源文件构成,而通过我们C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。因此进入链接阶段
- 链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。
- 链接时,面对Add函数,gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。
测试
对于函数func 我们进行查看的汇编语句
光标所在位置为c语言下的函数名
我们查看c++环境下的函数情况
通过下面的汇编语句我们发现同样的函数在c++中函数名就发生了变化。
extern “C”
某些情况下我们希望我们的函数能按照c语言风格进行编译,我们就可以加上extern“C”
缺省参数
在c语言中,函数没有指定参数列表时,默认可以接受任意多个参数
但在c++中,因为严格的参数类型检测,没有参数列表的函数,默认为void,不接受任何参数
c++对于函数参数检测更加严格,如果函数没有参数则不能接受任何参数
缺省参数: 缺省参数是声明或定义函数时为函数的参数指定的一个默认值,在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参
- 缺省参数一般从右往左进行缺省
- 缺省参数不能同时在函数声明和定义中出现,只能二者则其一
- 缺省值必须是常量或者全局变量
- C语言不支持