函数的匹配

  • 当重载函数的形参数量相等以及某些形参的类型可以由其他的类型转化得来的时候,对于函数的匹配就会变得很难

确定候选函数和可行函数

  • 函数匹配的第一步就是选定本次调用对应的重载函数集,集合中的函数称为候选函数。候选函数具有两个特征:1,与被调用的函数同名;2,声明在调用点是可见的。
  • 第二步,考察本次调用所提供的形参,然后从候选函数中选出能被这组实参调用的函数,这些新的选出的函数叫做可行函数。可行函数具有两个特征:1,形参变量和本次调用的形参数量相等;2,实参的类型和本次调用的从形参的类型相同,或者是可以转化成形参类型的实参。
  • 注意:如果函数含有默认的实参,那么在调用函数的时候,可能传入实参的数量看能小于他实际使用的数量

寻找最佳匹配

  • 函数匹配的第三步是从可行函数中选择与本次调用最为接近匹配的函数。原则是:实参类型和形参类型越接近,那么函数匹配的越好

含有多个形参的函数匹配

  • 实参的数量越多,匹配的难度越大
  • 条件:1,该函数的每一个实参的匹配都不会劣于其他可行的函数需要的匹配;2,至少有一个实参的匹配优于其他函数提供的匹配。
  • 调用重载函数的时候应该尽量避免使用强制类型转换。

6.6.1 实参类型转换

  • 为了确定最佳的匹配,编译器将实参类型转化分为几个等级
  1. 精确匹配,包括以下几种情形:1,实参类型和形参类型一致;2,实参从数组类型转化成对应的指针类型。;3,向实参添加顶层的const或者从实参中删除顶层的const
  2. 通过const转化实现匹配
  3. 通过类型的提升实现的匹配
  4. 通过算术类型转换或者指针转换实现匹配
  5. 通过类类型转换实现的匹配

需要类型的提升和算术类型的转换的匹配

  • 假设有两个同名的函数,一个接收int类型,一个接收short类型。则只有当调用提供的是short类型,才会去调用shaort版本的函数。因此有的时候,即使是一个很小的整数值,也会将其声明为int类型;此时使用short版本反而会导致类型的转换。
  • 所有的算术类型的转换的级别都是一样的,从int向unsigned int的转换,并不会比从int 向double转换级别高。
void manip(long);
void manip(float);
mainip(3.24);//错误,二义性调用

函数匹配和const实参

  • 如果重载函数的区别在于他们的引用类型的实参是否引用了const,或者指针类型的形参是否指向了const,则当调用发生的时候编译器通过实参是否是常亮来决定选择哪个函数。
Record lookup(Account& );// 函数的参数是Account的引用
Record lookup(const Account&);//函数的参数是一个常量的引用
const Account a;
Account b;
lookup(a);  //调用Record lookup(const Account& );
lookup(b);  //调用Record lookup(Account& );
  • 第一个调用中,传入的是const对象a,因为不可以把普通引用绑定到const对象上,所以此例中唯一可行的函数是以常量引用作为形参的那个函数,并且调用该函数与实参a精确匹配。
  • 第二个调用中,传入的是非常量b,对于这个调用来说,两个函数都是可行的,既可以使用b初始化常量的引用,也可以用它来初始化非常量的引用。然后,使用非常量对象初始化常量的引用需要类型的转换,接收非常量形参的版本则和b精确匹配。
  • 指针类型的形参也是类似的。唯一的区别在于指针的形参指向的是常量还是非常量。实参指向的是常量的指针,则会调用形参是const*的函数;如果实参是指向非常量的指针,调用形参是普通指针的函数。

C++ primer第六章6.6函数匹配相关推荐

  1. C++ primer第六章6.4函数的学习 之函数的重载

    6.4 函数的重载 函数的名字相同但是形参的列表不同,将其称之为重载函数 void print(const char *cp); void print(const int *beg,const int ...

  2. C++ primer第六章6.7函数指针

    函数指针 函数指针指向的是函数而不是对象.和其他指针一样,函数指针指向某种特定的类型.函数的类型由他的返回类型和形参类型共同决定,而与函数的名字无关. //比较两个string对象的长度 bool l ...

  3. C++ primer第六章6.5函数的学习 之特殊用途的语言特性

    6.5.1 默认实参 将反复出现的数值称为函数的默认实参,调用含有默认实参的时候可以包含该实参也可以不包含 比如程序打开页面会有一个默认的宽高,如果用户不喜欢也允许用户自由指定与默认数值不同的数值,具 ...

  4. C++ Primer 第六章—— 函数 思维导图

    C++ Primer 第六章-- 函数 思维导图 前言:该博文的定位是,您已经对C语言的基础知识和C++ Primer该书或C++知识有了基本了解.而在阅读C++ Primer(第五版)之后,感觉知识 ...

  5. C++ primer第六章函数的学习

    介绍 首先介绍函数的定义和声明,包括如何传入参数以及函数如何返回结果. C++语言允许使用重载函数,即几个不同的函数可以使用向同一个名字.所以接下来介绍重载函数的方法,以及编译器选择如何从函数的若干重 ...

  6. C++ primer 第六章 函数 思维导图

  7. SQL/Oracle——第六章 PL/SQL函数(作业3)

    第6章:PL/SQL块 --6-19 beginp3(var_job=>'SALESMAN',i,j,k); end; /declarecursor cur_emp(var_job in var ...

  8. C++ primer 第七章之 友元函数与友元类

    1.为什么需要友元函数?  类具有封装和信息隐藏的特性: 只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的 ; 非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公 ...

  9. C primer 第六章循环 习题6.7

    6.07 让用户输入一个单词,并倒序打印这个单词 #include <stdio.h> #include <string.h> int main(void) {    char ...

最新文章

  1. R回归模型glm与lm的区别
  2. 姿态迁移CoCosNet v2
  3. Asigra无代理备份:“云”数据保护的先行者
  4. Cooperative Content Distribution and Traffic Engineering
  5. 电大计算机考试题目excel,电大计算机考试复习题EXCEL部分
  6. 这位数字艺术的开拓者,通过计算机算法成就了新的艺术表达方式
  7. windows 和linux 同步api对比
  8. python作用域的顺序_“Python”函数的参数和范围,及其,作用域
  9. Ubuntu10.04下安装SQLite3
  10. 剑指offer系列之五十四:按之字形顺序打印二叉树
  11. openmeetings(开源视频会议系统)的详细安装步骤 (windows版)
  12. Python模拟黑客帝国影片中的终端动画脚本
  13. 海康门禁C# demo-开,关,常开,常关,授权,清权
  14. php 相似文章,php 比较两篇文章的相似度的方法
  15. 高三数学微课堂【教学视频】
  16. 无限滚动新一代老虎机
  17. am调制解调仿真matlab,AM调制与解调仿真matlab
  18. 【BZOJ2794】[Poi2012]Cloakroom 离线+背包
  19. Uniapp实现加入购物车抛物线效果
  20. 2022天猫618预售活动攻略 淘宝618预售时间以及怎么玩

热门文章

  1. linux实验三makefile,实验平台上Makefile详细的解释
  2. 【转】make makefile cmake qmake都是什么,有什么区别?
  3. 【转】01Teams的前世今生
  4. SharePoint List item数量超过5000的解决办法
  5. C#多线程编程系列(五)- 使用任务并行库
  6. 第四节:跨域请求的解决方案和WebApi特有的处理方式
  7. 第六节:框架搭建之EF的Fluent Api模式的使用流程
  8. 更改Sharepoint管理中心端口号
  9. Linq找不到行或行已更改
  10. 【CodeForces - 215C 】Crosses (思维,图形题)