函数重载是函数的一种特殊情况:
C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题
我们会有很多的场景使用函数重载, 比如我们想写一个Add(), 可以浮点,也可以整数, 但是又不想改变函数的名字,就可以用到函数的重载,根据 传入的参数让编译器去判断使用哪个函数
这就是函数重载的简单使用
有很多人会问, 缺省参数和函数重载在一起的时候,比如这样
f(1);
这样调用的到底是第一个呢,还是第二个呢,
事实上编译器是不允许这样的,因为不知道你调用的是哪个,你如果传2个参数,那会去调用下面那个,你如果传一个参数,就会报错
如果我们去调用
f(10) ;
f(20);
编译器如何知道你想使用的是哪个??? 不管有没有返回,都无法区别
所以,返回值不同,不构成函数重载
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接
预处理
编译
汇编
把汇编代码转换为二进制代码
生成符号表
链接
简单说明一下这些,大家都知道,我们在调用一个函数的时候,如果函数定义不在前面,那么需要声明,不然就会error
如果当前文件只有函数的声明,那么编译器就会在链接的时候去其他文件对应生成的符号表去找函数的地址
如果找不见,报的错误是LNK ,就是link错误, 链接器没有找到
可以看到 函数的名字被解析成了 _f
在Linux下,使用gcc编译
调用执行过程如图,C是通过函数名字去其他符号表中寻找地址的
如果C语言支持函数重载
这该如何确定? 一个名字对应多个地址?? 就有了二义性,冲突
C语言不支持函数重载,因为编译的时候,两个重载函数,函数名相同,在func.o 中的符号表中表示歧义,链接的时候也存在冲突,所以不支持
前面说了,C语言不支持重载的原因就是它用函数名来标识, 那么C++支持函数重载,说明一定不是用函数名来标识,那具体是怎么表示的呢?
这里使用g++在centos下编译 , 得到a.out,然后使用objdump工具查看
链接的时候使用修饰后的函数名进行查找,
在g++函数修饰规则是否是那样的呢?再来验证一下