函数重载的引入原因
在C语言中,函数名是唯一的,这样就导致具有类似功能的函数用了不同的名字,并且相同功能的函数因为数据类型的不同需要写好几种,比如下面的例子:
所以为了解决这种问题,C++中引入了函数重载的概念。
函数重载的用法
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数类型或个数或顺序(类型))不同,常用来处理实现功能类似数据类型不同的问题。
参数类型不同
参数个数不同
参数顺序(类型)不同
并且以上这三种情况可以叠加。
c++支持函数重载的原理——名字修饰
为什么C无法支持函数重载而C++就支持呢?
在C/C++中,程序的运行需要经历:预处理、编译、汇编、链接。
对于每个源文件都需要进行以上操作,而在经历完汇编之后每个源文件内部都会生成一个符号表,符号表中的符号和源文件中的变量名、函数名是一一对应的(并不是说一模一样,而是一种映射关系)。在这里我们要知道一点,函数声明在符号表中是只记录符号而不记录地址的,只有函数定义才记录符号以及地址,所以我们想要调用函数的定义,就必须将每个文件链接起来,揉合符号表(将多个符号表合成一个),这样才能从声明找到定义。
但是在C语言中符号表中的符号和函数名是一模一样的,如果我们在C语言中写多个同名函数,这就导致了符号表中会存在多个同名符号,但这样就无法保证一一对应的映射关系了。所以C语言不支持函数重载。
而在C++中,符号表中的符号和源文件中的名字是不一样的,符号表中的符号添加了一些修饰规则(根据参数),所以就导致相同的函数名因为不同的参数列表,从而在符号表中的符号也不同,这样就解决了C语言不能一一对应的问题,这就是函数重载的原理。
返回类型为什么不能作为函数重载的依据?
函数的作用:将有效的输入值变换为唯一的输出值,同一输入总是对应同一输出。
如果返回类型支持函数重载的话,那么我们输入相同的数据,编译器将采用哪个重载函数呢?这会导致输入相同的数据,但是输出不同的答案,这很显然违背世界对函数的定义。
所以返回类型不能作为函数重载的依据。