c++ 函数-函数匹配
文章目录
确定候选函数和可行函数
- 函数匹配地第一步是 选定 本次 调用对应 地重载函数集,集合中的函数 称为候选函数
候选函数 有两个特征:1、与被调函数同名,2、声明在调用点可见
-
第二步是 考察本次调用 提供的实参,然后从候选函数 选出 这组实参 调用的 函数 ,这些函数 称为可行函数
-
如果函数 有默认参数,则实参数量可少于 形参数量
void f();
void f(int);
void f(int ,int);
void f(double ,double = 3.14 );
f(3.2); //调用 第四个
含有多个形参地函数匹配
当实参 地 数量 有两个 或者 更多时,函数匹配就比较复杂了
当调用如下函数会发生什么
f(2,6.28);
该例 中 可行函数 是 f(int,int) , void f(double ,double = 3.14 )
接下来 编译器 依次检查 每个 实参 以确定 那个函数值最佳匹配 如果有且仅有只有一个函数 满足如下连个条件 则直接匹配成功:
- 该可行函数 每个参数 地匹配都 不劣于 其他可行函数 地匹配
- 至少有一个参数地匹配时优于 其他可行函数 提供的匹配
如果在这个检查后 没有一个可行函数 脱颖而出 ,则会报错,二义性调用
比如这个例子中就会报错,因为他们半斤八两
实参类型转换
编译器将 实参类型 到形参类型地转换划分为一下几个 等级 具体排序如下:
1、精确匹配 ,包括一下 情况 :
- 实参类型与形参类型相同
- 实参重 数组 类型 或者函数类型 转换成 对应 地 指针 类型
- 向实参 中 添加顶层 const 或者 从 实参中 删除 对应的 顶层const
2、通过 const 转换 实现地匹配
3、 通过类型 提升 实现匹配
4、通过算术类型 转换 或指针转换 实现的匹配
5、通过 类 类型 转换实现的转换
需要 类型 提升和算术类型 转换的匹配
//内置类型的提升和转换 可能 在函数 匹配时产生意想不到 的 结果
小整数 一般都会提升 到 int 类型 或者更大的整数类型
有时 即使实参 提供得是 一个很小的1整数值,也会直接 将他 提升成 int 类型 此时使用short版本 反而会 导致类型转换
void func(int);
void func(short);
func('a');//char 提升成 int 调用 int 版本
所有的 算数类型都一样,例如 从 int 向unsugned int 转换并不比 int 向 double 转换的类型搞
例如:
void _f(long);
void _f(float);
void _f(int);
_f(3.14); //错误 ,二义性
/*
字面值 3.14 的类型是 double 他既能转换成 long 也能转换成 float 和int
*/
函数匹配 和const 实参
如果重载函数 的区别 在于 他们 的引用类型 的形参 是否引用了 const ,或者 指针类型 的形参是否指向const ,
通过下面的例子了解这一点:
Record lookup(Account &);
Record lookup(const Account &);
const Account a;
Account b;
lookup(a); //调用 Record lookup(const Account &);
lookup(b); //调用 Record lookup(Account &);
所以 显然 编译器可以 取分这一点
那指针也是一样的 ,同样可以区分;