函数重载由来:
在实际开发中,有时候我们需要用到功能类似,只是参数列表不同的函数。在C语言中,我们往往不得不分别设计出几个不同名的函数。但在c++中,大可不必,c++就此情况,制定了相应的函数类型,允许多个函数拥有相同的名字,这就是函数重载的由来。
函数重载定义:
简单来说,c++允许多个执行功能相似的函数拥有相同的名字,只要他们的参数列表不同就可以,这就是函数的重载(Function Overloading)。
何为参数列表不同:
参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。(但是仅仅参数名称不同是不可以的。函数返回值也不能作为重载的依据。)
函数重载规则:
- 函数名称必须相同。
- 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
- 函数的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为函数的重载。
函数重载原理:
之所以 C++ 支持函数的重载,是因为 C++ 会在程序的编译阶段对函数的函数名进行“再次重命名”,例如:
- void Swap(int a, int b) 会被重命名为
_Swap_int_int
; - void Swap(float x, float y) 会被重命名为
_Swap_float_float
。
(注:不同的编译器有不同的重命名方式,这里仅作举例,实际情况可能并非如此。)
从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样。
当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。
重载决议匹配规则:
C++ 标准规定,在进行重载决议时编译器应该按照下面的优先级顺序来处理实参的类型:
优先级 | 包含的内容 | 举例说明 |
---|---|---|
精确匹配 | 不做类型转换,直接匹配 | (暂无说明) |
只是做微不足道的转换 | 从数组名到数组指针、从函数名到指向函数的指针、从非 const 类型到 const 类型。 | |
类型提升后匹配 | 整型提升 | 从 bool、char、short 提升为 int,或者从 char16_t、char32_t、wchar_t 提升为 int、long、long long。 |
小数提升 | 从 float 提升为 double。 | |
使用自动类型转换后匹配 | 整型转换 | 从 char 到 long、short 到 long、int 到 short、long 到 char。 |
小数转换 | 从 double 到 float。 | |
整数和小数转换 | 从 int 到 double、short 到 float、float 到 int、double 到 long。 | |
指针转换 | 从 int * 到 void *。 |
也就是说,当重载函数被调用时,编译器应该按照从高到低的顺序来搜索重载函数,首先是精确匹配,然后是类型提升,最后才是类型转换;一旦在某个优先级中找到唯一的一个重载函数就匹配成功,不再继续往下搜索。
(备注:以上内容部分参考于C语言中文网 , 此网站特别适合入门程序员的学习,本人极力推荐。链接地址:https://www.baidu.com/link?url=w6KtuouRIMSwfTnmhjErp_m0MQOM7sdJXH6NQyJ2GycunBVh_4v0aNCkAKdfPbxU&wd=&eqid=e1969dd20007844a0000000362b4459ahttps://www.baidu.com/link?url=w6KtuouRIMSwfTnmhjErp_m0MQOM7sdJXH6NQyJ2GycunBVh_4v0aNCkAKdfPbxU&wd=&eqid=e1969dd20007844a0000000362b4459a)