C++Primer第五版学习(函数部分 六)函数匹配
今天学习的内容也比较简单,学习的是函数匹配,不过,学习就是在于日积月累,每天学一点,都是进步。
在大多数情况下,我们容易确定某次调用应该选用哪个重载函数。然而,当几个重载函数的形参数量相等以及某些形参的类型可以由其他类型转换得来时,这项工作就不那么容易了。以下面这组函数及其调用为例:
void f();void f(int);
void f(int, int) ;
void f (double, double = 3.14) ;
f(5.6); //调用void f (double, double)
确定候选函数和可行函数函数匹配有三步:
第一步:是选定本次调用对应的重载函数集,集合中的函数称为候选函数(candidate function)。
候选函数具备两个特征:一是与被调用的函数同名,二是其声明在调用点可见。在这个例子中,有4个名为f的候选函数。
第二步:考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数称为可行函数(viable function)。
可行函数也有两个特征:一是其形参数量与本次调用提供的实参数量相等,二是每个实参的类型与对应的形参类型相同,或者能转换成形参的类型。
**第三步:**是从可行函数中选择与本次调用最匹配的函数(最佳匹配)。在这一过程中,逐检查函数调用提供的实参,寻找形参类型与实参类型最匹配的那个可行函数。
它的基本思想是:实参类型与形参类型越接近,它们匹配得越好。
含有多个形参的函数匹配
当实参的数量有两个或更多时,函数匹配就比较复杂了。对于前面那些名为f的函数,如果是使用(42, 2.56)这样的参数来调用:
此时,可行函数包括f(int, int)和f(double,double)。接下来,编译器依次检查每个实参以确定哪个函数是最佳匹配。如果有且只有个函数满足下列条件,则匹配成功:
.该函数每个实参的匹配都不劣于其他可行函数需要的匹配。
.至少有一个实参的匹配优于其他可行函数提供的匹配。
如果在检查了所有实参之后没有任何一个函数脱颖而出,则该调用是错误的。编译器将报告二义性调用的信息。
在上面的调用中,编译器最终将因为这个调用具有二义性而拒绝其请求:因为每个可行函数各自在一个实参上实现了更好的匹配,从整体上无法判断孰优孰劣。
在设计良好的系统中,不应该对实参进行强制类型转换。
**Best Practices:**调用重载函数时应尽量避免强制类型转换。如果在实际应用中确实需要强制类型转换,则说明我们设计的形参集合不合理。
实参类型转换
为了确定最佳匹配,编译器将实参类型到形参类型的转换划分成几个等级,具体排序如下所示:
1. 精确匹配,包括以下情况:
- 实参类型和形参类型相同。
- 实参从数组类型或函数类型转换成对应的指针类型。
- 向实参添加顶层const或者从实参中删除顶层const。
2.通过const转换实现的匹配。
3.通过类型提升实现的匹配。
4.通过算术类型转换或指针转换实现的匹配。
5.通过类类型转换实现的匹配。
相关文章
- C++ opencv高速样例学习——读图显示
- C++的学习路线以及未来就业趋势
- C++ 值传递 函数的分文件编写
- 在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static
- 《好学的C++程序设计》——第2章 对基本数据分类存储和访问
- C++Primer 学习(类 三)类的其他特性
- C++Primer第五版学习(函数部分 二)
- 学习opencv: 获取图像最大连通域 c++和python版
- C++反射机制:可变参数模板实现C++反射(使用C++11的新特性--可变模版参数,只根据类的名字(字符串)创建类的实例。在Nebula高性能网络框架中大量应用)
- 【C++ STL学习之五】容器set和multiset
- C++学习之继承篇(多继承与多重继承)
- C/C++ 指针的非空判断
- C++基础学习笔记----第十三课(操作符重载-下)
- 【C++快速上手】四、this指针学习笔记
- C++基础学习教程(七)----类编写及类的两个特性解析--->多态&继承
- C++机器学习古典材料
- C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类
- Linux C/C++方向开发(13周学习路线)