您的位置:首页 > 编程语言 > C语言/C++

C++primer学习笔记-----6.6函数匹配

2017-05-17 08:12 218 查看
确定候选函数和可行函数

函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数。候选函数具备两个特征:一是与被调用的函数同名,二是其声明在调用点可见

第二步考查本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数称为可行函数。可行函数也有两个特征:一是其可接受的实参数量与本次调用提供的实参数量相等,二是每个实参的类型与对应的形参类型相同,或能转换成形参的类型;(若没找到可行函数,编译器报错:无匹配函数)

第三步是藏可行函数中选择与本次调用最匹配的函数。】

含有多个形参的函数匹配(当实参的数量有两个或以上时,函数匹配比较复杂)

编译器依次检查每个实参以确定哪个函数是最佳匹配,如果有且只有一个函数满足下列条件,则匹配成功:

该函数每个实参的匹配都不劣于其他可行函数需要的匹配至少有一个实参的匹配优于其他可行函数提供的匹配。(优劣是下一节介绍的匹配等级的高低)

如果检查了所有函数之后,没有任何一个函数能够超过其他所有函数,编译器报错:二义性调用。】

6.6.1 实参类型转换

【为了确定最佳匹配,编译器将实参类型到形参类型的转换划分成几个等级

1、精确匹配:

实参类型与形参类型相同;实参从数组类型或函数类型转换成对应的指针类型;向实参添加顶层const 或从实参中删除顶层const。

2、通过const 转换实现的匹配(向实参添加底层const)。

3、通过整形提升(小整形向上提升成int 或unsigned)实现的转变。(即使实参是很小的整数值,有时候也会直接提升为int)

当两个同名函数一个接受int、一个接受short,则仅当传入实参为short 时才调用short,其它类型参数都会提升为int 或unsigned。

4、通过算数转换(算数类型之间的转换)或指针转换(转换为void *)实现的转换。

所有算数类型转换的级别都一样,例如从int 向unsigned 和从int 向double 的转换级别相同;从double 向float 和从double 向long 的转换级别相同。

5、通过类类型转换实现的转化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++