《C++ Primer》读书笔记-第六章 06 函数匹配

作者:马志峰
链接:https://zhuanlan.zhihu.com/p/23899851
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:

  • 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
  • 原书有更加详细、精彩的释义,请大家购买正版书籍进行学习。
  • 本文仅作学习交流使用,禁止任何形式的转载

有多个重载函数时,究竟哪个会被调用?

void f();
void f(int);
void f(int, int);
void f(double, double=3.14);
f( 5.6 );

函数匹配的过程

  1. 找出调用点可见的所有同名函数作为候选函数
  2. 找出参数数量相等,且实参与形参类型相同或可转换的函数,称为可行函数
  3. 找出最佳匹配

针对上面的例子

  1. 4个函数都是候选函数
  2. 第1个和第3个参数数量不同被排除,第2个和第4个为可行函数
  3. 实参与形参类型越接近,它们匹配的越好,所以这里f( 5.6 )调用的是第4个函数

多个形参的情况

必须同时满足以下条件

  1. 每个实参的匹配都不劣于其他可行函数的匹配
  2. 至少有一个实参的匹配优于其他可行函数的匹配
    且满足条件的函数只能有一个

比如f( 42, 5.6 );,考虑第一个参数时f(int, int)胜出,考虑第二个参数时f(double, double)胜出,因此没有最佳匹配,该调用是错误的

实参类型转换

前面提到实参和形参的类型越接近,匹配的越好。有以下的排序规则:

  1. 精确匹配
    • 实参和形参类型相同
    • 实参从数组或函数类型转换成对应的指针
    • 向实参添加顶层const或从实参删除顶层const
  2. 通过const转换实现的匹配
  3. 通过类型提升实现的匹配
  4. 通过算术类型转换或指针转换实现的匹配
  5. 通过类类型转换实现的匹配

总之我们在自己的程序中应当小心对待重载函数,避免调用出错

猜你喜欢

转载自blog.csdn.net/qq_26751117/article/details/53319018