作者:马志峰
链接:https://zhuanlan.zhihu.com/p/23899851
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接: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 );
函数匹配的过程
- 找出调用点可见的所有同名函数作为候选函数
- 找出参数数量相等,且实参与形参类型相同或可转换的函数,称为可行函数
- 找出最佳匹配
针对上面的例子
- 4个函数都是候选函数
- 第1个和第3个参数数量不同被排除,第2个和第4个为可行函数
- 实参与形参类型越接近,它们匹配的越好,所以这里f( 5.6 )调用的是第4个函数
多个形参的情况
必须同时满足以下条件
- 每个实参的匹配都不劣于其他可行函数的匹配
- 至少有一个实参的匹配优于其他可行函数的匹配
且满足条件的函数只能有一个
比如f( 42, 5.6 );,考虑第一个参数时f(int, int)胜出,考虑第二个参数时f(double, double)胜出,因此没有最佳匹配,该调用是错误的
实参类型转换
前面提到实参和形参的类型越接近,匹配的越好。有以下的排序规则:
- 精确匹配
- 实参和形参类型相同
- 实参从数组或函数类型转换成对应的指针
- 向实参添加顶层const或从实参删除顶层const
- 通过const转换实现的匹配
- 通过类型提升实现的匹配
- 通过算术类型转换或指针转换实现的匹配
- 通过类类型转换实现的匹配
总之我们在自己的程序中应当小心对待重载函数,避免调用出错