C++primer学习笔记-----6.6函数匹配
2017-05-17 08:12
302 查看
【确定候选函数和可行函数:
函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数。候选函数具备两个特征:一是与被调用的函数同名,二是其声明在调用点可见;
第二步考查本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数称为可行函数。可行函数也有两个特征:一是其可接受的实参数量与本次调用提供的实参数量相等,二是每个实参的类型与对应的形参类型相同,或能转换成形参的类型;(若没找到可行函数,编译器报错:无匹配函数)
第三步是藏可行函数中选择与本次调用最匹配的函数。】
【含有多个形参的函数匹配(当实参的数量有两个或以上时,函数匹配比较复杂)
编译器依次检查每个实参以确定哪个函数是最佳匹配,如果有且只有一个函数满足下列条件,则匹配成功:
该函数每个实参的匹配都不劣于其他可行函数需要的匹配;至少有一个实参的匹配优于其他可行函数提供的匹配。(优劣是下一节介绍的匹配等级的高低)
如果检查了所有函数之后,没有任何一个函数能够超过其他所有函数,编译器报错:二义性调用。】
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、通过类类型转换实现的转化。】
函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数。候选函数具备两个特征:一是与被调用的函数同名,二是其声明在调用点可见;
第二步考查本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数称为可行函数。可行函数也有两个特征:一是其可接受的实参数量与本次调用提供的实参数量相等,二是每个实参的类型与对应的形参类型相同,或能转换成形参的类型;(若没找到可行函数,编译器报错:无匹配函数)
第三步是藏可行函数中选择与本次调用最匹配的函数。】
【含有多个形参的函数匹配(当实参的数量有两个或以上时,函数匹配比较复杂)
编译器依次检查每个实参以确定哪个函数是最佳匹配,如果有且只有一个函数满足下列条件,则匹配成功:
该函数每个实参的匹配都不劣于其他可行函数需要的匹配;至少有一个实参的匹配优于其他可行函数提供的匹配。(优劣是下一节介绍的匹配等级的高低)
如果检查了所有函数之后,没有任何一个函数能够超过其他所有函数,编译器报错:二义性调用。】
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++primer学习笔记-----6.6函数匹配
- C++primer学习笔记-----6.1函数基础
- C++ 学习笔记(6)函数、局部静态对象、重载函数、内联函数、constexpr函数、调试帮助、函数匹配、函数指针
- C++primer学习笔记-----6.4函数重载
- opencv学习笔记:特征点匹配函数使用注意
- C++primer学习笔记之函数
- C++primer学习笔记-----6.7函数指针
- 【C++学习笔记】函数匹配和函数指针
- C++primer学习笔记-----6.4函数重载
- C++学习笔记五——函数重载(多态)、函数模板及函数模板重载和完全匹配与最佳匹配
- C++ Template学习笔记之函数模板(1)——函数模板定义
- Java 学习笔记 (10) - Java 函数的递归调用
- [LUA学习笔记03]LUA函数和C函数的相互调用
- JavaScript学习笔记8--一个文字自动匹配的例子
- perl学习笔记六----函数
- MyGeneration学习笔记(8) :dOOdad提供的数据绑定、特殊函数和事务处理
- C++ Template学习笔记之函数模板(5)——模板编译模式
- stl学习笔记2(容器,函数对象)
- php学习笔记8-(定义函数)
- [转]C++ Template学习笔记之函数模板(5)——模板编译模式