首页 > 编程知识 正文

函数重载的原理,函数重载重写重定义

时间:2023-05-05 23:26:43 阅读:228312 作者:4125

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

不知道大家有没有人对

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

有更深的认识。

 

 

 

 

 

 

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。