目录
重点:
希望这篇文章对你有帮助。
一、函数重载
C++允许在同一范围中声明几个功能类似的同名函数
例如:
int Add(int a, int b)
{
return a + b;
}
double Add(int a, double b)
{
return a + b;
}
函数重载必须在下列一个或两个方面有所区别:
1、函数参数个数不同
2、函数参数类型不同
3、函数参数顺序不同
二、编译+链接
想要了解函数重载,就要首先了解编译的过程
我们首先建立和
这两个项目其中Add.cpp中包含两个重载函数分别是
int Add(int a, int b)
double Add(int a, double b)
test.cpp 中含有调用add函数的主函数。go.h存放函数的声明。
要把test.cpp变成可执行程序test.exe要进行以下步骤:
直观点呢,就是这样
咋们接下来细细讲讲每一步,至于函数重载的知识看官别急,我们来循序渐进的一步步探索
2.1预处理
1.展开头文件
库中的内容会被展开
就如这样
2.删除注释
这句话在预处理时会被删掉
3.#define定义的符号的替换
例如:
其中MAX会被替换为1000
2.2编译
1.将C语言代码转换为汇编代码
其中部分就是汇编代码
2.语法分析
3.词法分析
4.语义分析
这以上都是在检查语法的正确性。
5.符号汇总
我们将这种具有全局性的符号进行汇总.
这一步是在为下一步做准备
总之,就是检查的你的语法问题,如果你在在线OJ时,报错是编译错误,有可能是你的语法出了问题。
2.3汇编
1.将汇编代码转换为二进制指令
二进制指令专门为CPU服务,CPU来依照执行。
2. 形成符号表
这是重点,我们重点来讲下。
这时我们就要形成符号表
这里看客会有疑问两个Add函数怎么对应相应的所调用的函数呢?
我们继续往下看
2.4链接
1.合并段表
2.符号表的合并和重定位
这时:
符号表开始汇总:
c语言背景下
这时错误出现了
究竟是哪个Add对应哪个地址呢??????
这就是C的缺点所在,我们在调用时,通过汇编代码可以看到
通过call来依据地址找寻所调用的函数,地址不明确,链接报错,程序出了问题
所以C支持不了函数重载
让我们来看看C++是怎么做的
C++中Add函数不单纯摆在那里就叫Add
它会依据函数的名称和参数来修饰函数名字
如:
这个原函数是
int f(double a , int b)
在gcc的编译环境下,我们看到这个函数被命名为 _Z1fdi。
我们依据我们的Add函数来命名下
int Add(int a, int b)
double Add(int a, double b)
如此就是:
这样就简单了,我们回到符号表汇总那一步骤
两个Add函数地址会被对应的地址覆盖,并在使用时被找到对应的函数
这样函数调用时就会按地址索骥
这样函数重载就可以使用了!
三、总结
C++中把函数的名字在符号表汇总时进行了函数名修饰,重载函数之间有不同的参数的区别,这时可以通过这种修饰来更好的寻找对应的函数地址,从而可以函数重载。
而C就傻傻的将函数名字原封不动地停留在原地,以至于有多个重载函数(函数名相同)会找不到对应的地址,以至于不能函数重载。
谢谢观看,如有错误请指出哈,如有帮助请点个赞喔。