一、函数匹配
  在大多数情况下,比较容易确定某次调用应选用哪个重载函数,然而当几个重载函数的形参数量相等以及某些形参的类型可以由其他类型转换得到时,这个相对就不那么容易。

1.1 实参类型转换
  确定最佳匹配,编译器将实参类型到形参类型的转换分成以下几个等级:
  1.精确匹配,包括:
   ①实参类型和形参类型相同;
   ②实参从数组或函数类型转换成对应的指针类型;
   ③向实参添加层const或者从实参中删除顶层const。
  2.通过const转换实现的匹配。
  3.通过类型提升实现的匹配。
  4.通过算术类型转换或者指针转换。
  5.通过类类型转换实现的匹配。
  ①需要类型提升和算术类型转换的匹配。分析函数调用前,我们应该知道小证书一般都会提升到int类型或更大的整数类型。假设两个函数,一个接受int、另一个接受short,则只有当调用提供的是short类型的值时才会选择short版本的函数。有时即使实参是一个很小的整数值,也会直接将它提升成int类型,此时使用short版本反而会导致类型转换:

void ff(int);
void ff(short);
ff('a');                          //char提升成int,调用ff(int)

  所有算术类型转换的级别都一样,例如从int向unsigned int的转换并不比从int向double的转换级别高。

void mainp(long);
void mainp(float);
mainp(3.14);                     //错误,二义性调用

1.2 函数匹配和const实参
  如果重载函数的区别在于它们的引用类型的形参是否引用了const,或者指针类型的形参是都指向const,则当调用发生时编译器通过实参是否是常量来决定选择哪个函数。

Record lookup(Account&);         //函数的参数是Account的引用
Record lookup(const Account&);   //函数的参数是一个常量引用
const Account a;
Account b;lookup(a);                       //调用lookup(const Account&)
lookup(b);                       //调用loopup(Account&)

二、函数指针
  函数指针指向的是函数而非对象,函数的类型由它的返回类型和形参类型共同决定,与函数名无关.

bool lengthCompare(const string &,const string &);

  上述函数的类型是bool(const string & ,const string & ),要声明一个可以指向该函数的指针,只需要用指针替换函数名即可。

//pf指向一个函数,该函数的参数是两个const string的引用,返回值是bool类型
bool (*pf)(const string &, const string &);   //未初始化

  pf前面有个表示pf是指针,右侧是形参列表,表示pf指向的是函数,函数的返回类型是布尔值,所以pf是一个指向函数的指针,该函数的参数是两个const string的引用,返回值是bool类型。需要注意的是*pf两端的括号不可少,如果不写这对括号,那么表示pf是一个返回值为bool指针的函数,即函数返回bool

2.1 使用函数指针
  如果把函数名作为一个值使用,该函数自动地转换成指针。如下间lengthCompare的地址赋给pf。

pf = lengthCompare;                  //pf指向名为lengthCompare的函数
pf = &lenghtCompare;                 //等价的赋值语句,取址符是可选的
bool b1 = pf("hello","goodbye");     //调用lengthCompare函数
bool b2 = (*pf)("hello","goodbye");  //一个等价的调用
bool b3 = lengthCompare("hello","goodbye");   //另一个等价的调用

2.2 重载函数的指针
  当我们使用重载函数时,上下文必须清晰地界定到底应该选用哪个函数,如果定义指向重载函数的指针,编译器通过指针类型决定选用哪个函数,指针类型必须与重载函数中的某一个精确匹配:

void ff(int*);
void ff(unsigned int);
void (*pf1)(unsigned int) = ff;     //pf1指向ff(unsigned)void (*pf2)(int) = ff;              //错误,没有任何一个ff与该形参列表匹配
double (*pf3)(int*) = ff;          //错误:ff和pf3的返回类型不匹配

2.3 函数指针形参
  和数组类似,虽然不能定义函数类型的形参,但是形参可以是指向函数的指针,这样形参看起来是函数类型,实际是当成指针来使用:

//第三个形参是函数类型,它会自动地转换成指向函数的指针
void useBigger(const string &s1,const string &s2,bool pf(const string &,const string &));
//等价的声明,显式地将形参定义成指向函数的指针
void useBigger(const string &s1,const string &s2,bool (*pf)(const string &,const string &));

2.4 返回指向函数的指针
  和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针,此外,必须把返回类型写成指针形式,编译器不会自动地将函数返回类型当成对应的指针类型处理。声明一个返回函数指针的函数,最简单的办法是使用类型别名:

using F = int(int*,int);             //F是函数类型,不是指针
using PF = int(*)(int*,int);         //PF是指针类型
PF f1(int);                          //正确,PF是指向函数的指针,f1返回指向函数的指针
F f1(int);                           //错误,F是函数类型,f1不能返回一个函数
F *f1(int);                          //正确,显式地指定返回类型是指向函数的指针
int (*f1(int))(int*,int);            //正确,直接声明f1

参考文献:
①C++ primer 第五版

【C++学习笔记】函数匹配和函数指针相关推荐

  1. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  2. Vue学习笔记进阶篇——Render函数

    本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编 ...

  3. Unity学习笔记:监听函数有什么卵用?(似乎就是从一件事过渡到另一件事?)

    Unity学习笔记:监听函数有什么卵用?(似乎就是从一件事过渡到另一件事?) 个人学习经验,仅供参考,欢迎各位码友批评指正. 做项目敲代码时,一直不是很理解监听函数是个什么玩意. 按我目前的理解,说白 ...

  4. 没有varselect这个函数_JavaScript学习笔记(四)-- 函数基础

    函数基础 我们代码里面所说的函数和我们上学的时候学习的什么三角函数.二次函数之类的不是一个东西 函数的概念 对于 js 来说,函数就是把任意一段代码放在一个 盒子 里面 在我想要让这段代码执行的时候, ...

  5. 【Python学习笔记】第八章 函数

    [Python学习笔记]第八章 函数 文章目录 [Python学习笔记]第八章 函数 前言 8.1 定义函数 8.2 调用函数 8.2.1 使用位置参数调用函数 8.2.2 使用关键字参数调用函数 8 ...

  6. oracle数据变化记录,学习笔记:Oracle伪列函数ora_rowscn 记录表中行数据的修改时间...

    天萃荷净 Oracle数据库开发时使用伪列函数ora_rowscn查询出数据库表中行数据的修改时间 一.默认情况下 –创建t_orascn测试表 SQL> create table t_oras ...

  7. C语言学习笔记(8)函数

    C语言学习笔记(8)函数 函数 函数主要是用于将解决复杂的编程问题分解为数个可以分开进行解决的小问题,通过函数分装,最后在拼连在一起.有利于多人协作开发. 函数同样需要先声明后调用,声明符号为 voi ...

  8. python 内置函数转list_python学习笔记11-python内置函数

    python学习笔记11-python内置函数 一.查看python的函数介绍: 二.python内置函数 1.abs获取绝对值: 通过python官网查看absabs(x) Return the a ...

  9. 2020-09-25C++学习笔记引用2:二级指针形参与指针形参的使用方法和区别重难点,主看综合代码(1、指针形参2、引用形参3、二级指针形参4、指针引用形参)

    2020-09-25C++学习笔记引用2:二级指针形参与指针引用搭配做形参的使用方法区别重难点,注意事项主看综合代码(1.指针形参2.引用形参3.二级指针形参4.指针引用形参) 1.指针引用 #inc ...

  10. 百度计算广告学沙龙学习笔记 - 内容匹配广告

    百度计算广告学沙龙学习笔记 - 内容匹配广告 时间 2014-02-05 18:53:55 CSDN博客 原文  http://blog.csdn.net/three_body/article/det ...

最新文章

  1. C++ Primer第18章Vector的再实现及bug修正
  2. 数学笔记3——导数3(隐函数的导数)
  3. 记录知识点或技术方案信息
  4. android eclipse不能创建activity,在eclipse里面开发android应用,不能新建Activity
  5. 移动端学习笔记(黑马教程)-仿京东首页
  6. java正则表达式yyyymmdd_正则表达式校验YYYYMMDD日期格式
  7. Android EditText 属性汇总
  8. 微信公众号内置浏览器缓存清理
  9. jsp之${CTX}理解
  10. VMDNAMD命令规则(转载)
  11. 我奋斗了十八年才和你坐在一起喝咖啡
  12. 双有源桥(DAB)psim/simulink闭环控制仿真,SPS/DPS/TPS控制均可,图中显示了sps控制的负载阶跃响应全新
  13. 二手车电商三国杀,广告大战究竟该不该打?
  14. ureport 显示html,Ureport2报表使用问题及注意事项汇总
  15. 排列组合-9.1 排列组合系列问题
  16. ZEALER背后的乐视云视频
  17. 世界首富一天赚多少钱?说出来怕你受不了
  18. Linux,个人笔记用
  19. SGMII调试及丢包问题
  20. MySQL计算正方形的面积_计算如图所示长方体、正方体的表面积和体积.(1)长方体表面积:______体积______(2)正方...

热门文章

  1. ZooKeeper客户端Curator的基本使用
  2. 知识付费,下半场怎么走(附大会PPT下载)
  3. ASUS TUF GAMING B660M PLUS WIFI D4 i5-12600K RX6650XT 黑苹果efi引导文件
  4. 网线,交换机基础命令
  5. 微信编辑器 wxEditor 最牛逼的富文本编辑器
  6. 社保证照片怎么做?一招教你get既专业又好看的证件照!
  7. 【PBR系列一】PBR知识体系
  8. Office 2016 VOL版安装文件
  9. Python-matplotlib:调整坐标轴位置、标签位置和标签方向,以及X轴刻度标签位置
  10. TXT文本大数据手机号码归属地批量归类查询处理工具