C++函数重载
最近,开始接触C++,今天再简单介绍一下C++的一些特点今天要介绍的重点是C++的重载。
首先介绍一下大家遇到的问题,假如我现在需要我现在需要交换两个变量的值,我需要做的是通过一个函数来实现,那基本思路就是将需要交换的数据当做变量传入我们的函数,然后在函数内完成交换。
void swap(int *a, int *b); 我们就需要通过这个函数来实现函数的名字叫做swap,这里我们实现的是int类型数据的交换,那假如我们现在要交换的是float类型的呢?再创建一个函数void swap2(float *a, float *b),这时候函数就不能叫做swap因为C语言中是不允许存在名字的函数的所以只能另起一个名字,如果再有一个其他类型的数据那就在需要一个swap3函数了,但是这些在C++解决起来就方便了很多 ,最简单的来说在C++中是可以几个函数叫一样的名字的,不过他也有一定的条件,那就是传入的参数必须是不相同的。
这个特点是可以通过汇编语言来进行证明的,这里首先要做的是在不同格式文件下对你的程序进行反汇编操作,第一种是TEXT.C文件下,这种情况下编译器是以C的格式和要求来进行编译的,另一种是在TEXT.CPP情况下进行编译的。
首先通过汇编代码看一下,这段代码是在linux下进行实现的,在linux下转成汇编还是十分方便的,通过这段代码就能看出来当在C++情况下对函数进行调用的时候,在call语句后边不只是简单的函数名地址来进行调用的。
void print(int i) 编译之后函数名变成了_Z5printi) 而函数void print(string str) 编译之后为:它的函数签名变为——_Z5printSs)所以虽然函数名一样,但是当参数不同的时候在调用的时候他的函数名也是不同的,所以这在C++中可以函数名的重载。
为什么C++能通过参数的不同来实现函数的重载。在C++中,当编译器来实现调用函数的时候,需要先将函数进行解析与C语言不同的是,C++在调用函数的时候不是单纯的通过函数名地址来实现,而是返回类型+函数名+参数列表,参数列表也是C++中一个相对重要的概念,之后也会在C++参数列表赋值的时候对参数列表进行一个更详细一点的介绍,正是因为这种调用函数的机制才能将相同函数名的函数进行区分开来。
大致步骤分为下边四个步骤:
1. 通过匹配方法来进行函数调用,获得你想要调用的函数名称
2. 获得函数各参数的表达式类型
3. 通过语法分析器查找拥有重载的函数,符号表的内部经过重载解析返回最佳的函数
4. 通过语法分析器来查找将符号表中的存储的最佳函数类型绑定到语法树上边
这是我在网上找到的一张图片,可以很好的来介绍这个过程,侵删。
在这里我简单的对C++的函数重载进行了一个简单的介绍,介绍的并不是很清楚。希望大家见谅,如果有更好的解释方法大家可以发出来一起学习。