函数重载写法与实现原理

在讨论函数重载之前我想应该回顾一下之前的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++代码在编译时会对函数进行重命名,从这个角度讲函数重载本质上还是不同的函数,占不同的内存,入口地址一也不一样,当函数调用时,编译器会跟据传入的实参去逐个匹配,已选择对应的函数,如果匹配失败,编译器会报错(链接时),这叫重载决议。

不知道大家有没有人对

函数重载;同一个作用域;函数名相同参数列表不同——〉参数列表不同(个数,类型,次序)与返回值是否相同无关

有更深的认识。











猜你喜欢

转载自blog.csdn.net/a15929748502/article/details/80748747