函数重载的由来
在C语言中,我们经常会写一个Swap函数
可是我们在使用的时候发现,如果我们需要交换一个非整形数应该怎么办?
在C语言里,我们经常会对函数名进行修改
但是通过这样,我们的函数取名与调用会变得非常麻烦,同时可读性也会变差,此时,C++中就出现了函数重载这一语法来解决这个问题
我们可以在全局中定义多个同名函数,其传入参数的个数,类型和顺序不同,我们在调用时会自动检测与匹配调用的函数,从而实现功能类似但数据类型不同的问题
函数重载的使用
1.参数类型不同
例如我们经常使用的add函数,我们可以修改参数的类型来实现函数重载
编译器会自动检测传入参数的类型,匹配后调用相应的函数
2.参数个数不同
3.参数顺序不同
注意:这里的顺序不同指的是类型的顺序不同,而非局部变量的名称顺序不同!
而此时可能有人会认为,是不是因为a和b的顺序不同,导致调用参数的不同呢?
我们将函数修改一下:
我们发现,函数的调用和局部变量的名称没有一点关系,参数的顺序指的是类型的顺序,而非变量名称的顺序
函数重载的原理
在C语言中,我们编译完一个程序后将其运行,编译器会生成一个字符表,字符表中每一个函数名都有其存在的地址,在需要调用该函数时编译器会先对照字符表找到函数,然后对照着找到函数的地址对其进行调用,因此,C语言无法定义重名函数是因为在调用时防止编译器在字符表中找到两个相同名称不同地址的函数,从而产生歧义。
而在C++中,编译器仍是以字符表的方式找到函数,为什么C++就支持同名函数呢?
因为在字符表中,函数名不是以其原名存在,编译器会先将其进行修饰再放入字符表中。
对于C语言,函数名修饰后仍是原名,而在C++中,函数名修饰后会带上其参数类型特征再放入字符表中
例如:func(int a,double b);(真实修饰规则并非如此,仅仅是举例方便理解)
在字符表中,该函数会被修饰为funcid,表示的是函数名为func,类型为int和double
而其同名函数func(double b,int a)则会被修饰为funcdi,表示函数名为func,类型为double和int
函数在被调用时,会先检查其函数名,再检查其函数类型,将其组合成为一个修饰后的名称后,再与字符表中的函数名称进行匹配,这样便是函数重载的原理
此时便解释了为什么函数重载与局部变量名无关,同时也说明了返回值不同无法构成函数重载。