函数重载:
允许多个函数共享一个函数名,每个参数列表唯一(函数签名唯一)(参数列表个数不一样, 或则参数类型不同)。
重载条件:
- 函数的返回类型不足以区分两个函数。(在调用的时候一般不指定返回的类型,而且有很大一部分的返回都会进行隐式或则是显示类型转换)
- 函数的缺省实参不足以区分两个函数。
- 使用typedef类型别名的不足以区分两个函数(没有产生新的类型)
- 参数修饰符(const volatitle)不足以区分两个函数。(参数的声明修饰符号没有改变传递的实参的类型, 可以视为接受相同的参数集)
重载函数作用:
- 为相同功能的一组函数提供相同的名字,将程序员从复杂的词汇中解放。
- 为提供不同的参数实例化不同的对象提供了实现的可能,构造函数都是同名的。
- 在操作符重载中,丰富了操作符的含义,提供了操作符功能的多重性。
类型安全链接:
把参数的个数和类型进行编码,附加在函数名后面,形成唯一的内部名编码;编译系统的底层组建只能看到编码后的名字。解决了链接阶段按照函数名区分不同实体时遇到重载函数的尴尬,通过这个机制,链接阶段区分重载函数就不会出现尴尬。
重载解析:
把函数调用与重载函数集合中的一个函数相关联的过程。
重载解析(模版实参推演)的三个步骤:
1、 确定重载函数集合(可见域内里面的每一个候选函数与被调函数同名),此外还要确定被调函数中的参数列表的属性。
2、从候选函数集合里面选出一到多个可行函数,如果没有选出可行函数则无匹配情况。(可行函数:可行函数的参数个数等于或则大于调用函数的参数个数, 多余的必须是带缺省实参的;实参与该函数的参数类型存在可以转换的关系)
在进行挑选的时候,对可行函数进行划分等级:
a:精确匹配:实参与函数参数列表类型精确匹配。
符合精确匹配的情况:
从左值到右值的转换
从数组到指针的转换
从函数到指针的转换
限定修饰转换(只影响指针):
![]()
这里为两个重载函数,而void set(char *const );不是
b:与一个类型转换匹配。实参不直接与参数类型匹配,但是它能转换成这样的类型。
可能的转换:
提升:char, unsigned char, short, 提升为int; float提升double; 枚举类型转为int, unsigned int, unsigned long; bool转化为int
标准转换:整值类型的转换,浮点类型的转换,浮点-整值的转换,指针转换,bool类型的转换
用户定义的转换:
c:无匹配:实参不能与声明的函数参数匹配,无法进行函数之间的类型转换。
3、 选择最佳可行函数(或叫最佳匹配函数)
如果有两个可行函数要对实参进行标准转换以匹配各自参数的类型,那么这个调用就是二义的,被标记为编译错误。