在讨论函数重载之前我想应该回顾一下之前的C语言代码,因为没有比较是显不出函数重载的方便的
在这里我们举一个例子,我们要实现一个加法器,要求是可以解决整形和浮点型的运算,于是我们写出如下代码
我们尝试用C语言的编译器来编译,虽然我们知道C语言中明确规定函数名不可以相同。
报出以上错误
所以这种方法是不行的,我们只能用以前的老方法了,改掉函数名写两个函数
但是在函数名相同,用C++来编译是和之前不一样的事情发生了
我们看到了不一样的结果,说明C++的确是支持重载的
下限我们将验证函数重载中说到的所有情况
函数重载;同一个作用域;函数名相同参数列表不同——〉参数列表不同(个数,类型,次序)与返回值是否相同无关
首先我们验证参数列表不同(个数,类型,次序)的情况
下面我们来验证一下返回值不同时是否可以构成重载。
事实证明这样做是不行的。
也就是说上面的定义是完全正确的
函数重载;同一个作用域;函数名相同参数列表不同——〉参数列表不同(个数,类型,次序)与返回值是否相同无关
看到这里其实函数重载的语法就已经看完了,可函数重载是依靠什么实现的呢,为什么C语言不行而C++却可以呢。请让我们继续向下探究。
我们知道一个test.c文件其实是由test.h和main.c组合而成,分为以下几个步骤
1,预处理 展开头文件/宏替换/去注释/条件编译。 test.h——>test.i main.c——>main.i
2,编译 检查语法,生成汇编语言。 test.i---->test.s main.i——>test.s// 包括;找main函数中出现的函数的声明,目的是告诉编译器有这样一个函数。
3,汇遍 汇编代码转成机器码 test.s--->test.o main.s——>main.o
4,链接 链接到一起生成可执行程序。 test.o,main.o. ————>a.out//包括;照者函数名找真正函数定义的地方,找不到会报链接错误
在C语言中
编译时是不可以通过的,爆出错误重复定义Add函数,为了让他编译通过修改为
下面我们要用一个工具objdump(目标导出指令),可以看到有许多参数,
我们想要看汇编语言应选-s,如下图
得到汇编代码,下来我们找到我们需要的那一段,并为大家截出
大家可以看到用C编译时函数名不做改变。
下面我们来调整一下函数(因为C++支持重载)并重新编译,
可以看到变异后的函数名发生了变化
且是有一定规律的
联系以前所学可得到
这就是C++可以重载的原因了(用这种编译时修饰函数名(也就是C++的函数名修饰规则))
总结一下;C++代码在编译时会对函数进行重命名,从这个角度讲函数重载本质上还是不同的函数,占不同的内存,入口地址一也不一样,当函数调用时,编译器会跟据传入的实参去逐个匹配,已选择对应的函数,如果匹配失败,编译器会报错(链接时),这叫重载决议。
不知道大家有没有人对
函数重载;同一个作用域;函数名相同参数列表不同——〉参数列表不同(个数,类型,次序)与返回值是否相同无关
有更深的认识。