函数重载是C++的一个重要特性,但是函数重载后调用哪一个函数往往令人很困惑,参照《C++ Primer》第七章的内容总结如下:


重载确定函数调用的步骤
1、候选函数(candidate function)
   1)、仅当形参是引用或指针时,形参是否为const 才有影响
   2)、不能基于指针本身是否为const 来实现函数重载
   3)、return 的类型不能用于判断重载

2、可行函数
   1)、函数形参个数匹配(默认参数也是实参)
   2)、类型匹配,包含隐式转换的匹配
3、寻找最佳匹配
  1)、精确类型匹配 > 需要转换的匹配
  2)、通过类型提升的转换 > 其他标准转换


我还是喜欢用实际的例子来说明问题:

  1 #include <iostream>
  2 #include <cstdlib>
  3
  4 /*=================================================================*\
  5  *
  6  *              重载确定函数调用的步骤
  7  *
  8  *                2013/6/5 by 樊列龙
  9  *
 10 \*=================================================================*/
 11
 12 /*
 13  * 重载确定函数调用的步骤
 14  * 1、候选函数(candidate function)
 15  *      1)、仅当形参是引用或指针时,形参是否为const 才有影响
 16  *      2)、不能基于指针本身是否为const 来实现函数重载
 17  *      3)、return 的类型不能用于判断重载
 18  * 2、可行函数
 19  *      1)、函数形参个数匹配(默认参数也是实参)
 20  *      2)、类型匹配,包含隐式转换的匹配
 21  * 3、寻找最佳匹配
 22  *      1)、精确类型匹配 > 需要转换的匹配
 23  *      2)、通过类型提升的转换 > 其他标准转换
 24  */
 25
 26 using namespace std;
 27
 28
 29 ////
 30 void funA(int &a, int &b)
 31 {
 32     cout << "调用:funA(int &a, int &b)" << endl;
 33 }
 34
 35 void funA(const int &a, const int &b)
 36 {
 37     cout << "调用:funA(const int &a, const int &b)" << endl;
 38 }
 39
 40
 41 ////
 42 void funB(int *a, int *b)
 43 {
 44     cout << "调用:funB(int *a, int *b)" << endl;
 45 }
 46 void funB(const int *a, const int *b)
 47 {
 48     cout << "调用:funB(const int *a, const int *b)" << endl;
 49 }
 50
 51 ////
 52 void f()
 53 {
 54     cout << "调用:void f()" << endl;
 55 }
 56
 57 void f(int )
 58 {
 59     cout << "调用:void f(int )" << endl;
 60 }
 61
 62 void f(int , int i = 1 )
 63 {
 64     cout << "调用:void f(int , int )" << endl;
 65 }
 66
 67 void f(double, double d = 1.0)
 68 {
 69     cout << "调用:void f(double, double)" << endl;
 70 }
 71
 72
 73 ///
 74 void ff(short)
 75 {
 76     cout << "调用:void ff(short)" << endl;
 77 }
 78 void ff(int)
 79 {
 80     cout << "调用:void ff(int)" << endl;
 81 }
 82
 83 ///
 84 void fff(long)
 85 {
 86     cout << "调用:void fff(long)" << endl;
 87 }
 88 void fff(float)
 89 {
 90     cout << "调用:void fff(float)" << endl;
 91 }
 92
 93 int main()
 94 {
 95     int a, b;
 96     const int ca = 0;
 97     const int cb = 0;
 98
 99     funA(a,b);     // 调用:funA(int &a, int &b)
100     funA(a,cb);    // 调用:funA(const int &a, const int &b)
101     funA(ca,cb);   // 调用:funA(const int &a, const int &b)
102
103     funB(&a,&b);   // 调用:funB(int *a, int *b)
104     funB(&ca,&cb); // 调用:funB(const int *a, const int *b)
105     funB(&a,&cb);  // 调用:funB(const int *a, const int *b)
106
107
108     f(5.6);        // 调用:void f(double, double)
109     //f(5);          // Error: 调用重载的‘f(int)’有歧义
110     //f(5,6.0);      // 错误:调用重载的‘f(int, double)’有歧义
111     f(static_cast<double>(5),6.0);// 调用:void f(double, double)
112     f(5,static_cast<int>(6.0));   // 调用:void f(int , int )
113
114
115     cout << "sizeof(short): " << sizeof(short) << endl;
116     cout << "sizeof(char): " << sizeof(char) << endl;
117
118     ff('a');                      // 调用:void ff(int)
119
120     //double 既可以转换为long 也可以转换为 float,有二义性
121     //fff(3.14);                    // 错误:调用重载的‘fff(double)’有歧义
122
123     return EXIT_SUCCESS;
124 }


执行结果:

 1 调用:funA(int &a, int &b)
 2 调用:funA(const int &a, const int &b)
 3 调用:funA(const int &a, const int &b)
 4 调用:funB(int *a, int *b)
 5 调用:funB(const int *a, const int *b)
 6 调用:funB(const int *a, const int *b)
 7 调用:void f(double, double)
 8 调用:void f(double, double)
 9 调用:void f(int , int )
10 sizeof(short): 2
11 sizeof(char): 1
12 调用:void ff(int)

View Code

转载于:https://www.cnblogs.com/CocoonFan/archive/2013/06/05/3118240.html

C++ 如何判断所调用的重载函数相关推荐

  1. C++ 函数匹配 重载函数的调用规则

    学习<C++ Primer>一书中,函数匹配这一节内容信息较多,现截取重点内容记录于此.便于你对本文内容更好的理解,你需对类型提升.算术类型转换以及顶层cosnt,底层const有一定的了 ...

  2. 一文说尽C++赋值运算符重载函数(operator=)

    http://www.cnblogs.com/zpcdbky/p/5027481.html 在前面: 关于C++的赋值运算符重载函数(operator=),网络以及各种教材上都有很多介绍,但可惜的是, ...

  3. C++学习笔记(十二):重载函数

    1. 什么是重载函数 假设同一作用域内的几个函数名字同样但形參列表不同.那么这些函数就称之为--重载函数. 比如: void print( const char *cp); void print(co ...

  4. C++ ——赋值运算符重载函数

    文章目录 前言 一.赋值运算符重载函数是什么? 二.细谈赋值运算符重载函数 2.1 参数列表 2.2 返回值 2.3调用时机 二.赋值运算符重载函数练习 前言 在介绍赋值运算符重载之前,我们先看一段代 ...

  5. C++——重载运算符和重载函数

    重载运算符和重载函数 C++ 中的函数重载 C++ 中的运算符重载 C++ 一元运算符重载 C++ 二元运算符重载 C++ 关系运算符重载 C++ 输入/输出运算符重载 C++ 赋值运算符重载 C++ ...

  6. C++ 重载运算符和重载函数(一)

    C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不 ...

  7. c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...

    一.前言 本部分为C++语言刷题系列中的第8节,主要讲解这几个知识点:复制构造函数和赋值运算符重载函数.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:复制构造函数 1.当依据 ...

  8. 重载函数和重载运算符

    C++允许在同一个作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但他们的参数列表和定义(实现)不相 ...

  9. c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数

    一.前言 本部分为C++语言刷题系列中的第8节,主要讲解这几个知识点:复制构造函数和赋值运算符重载函数.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:复制构造函数 1.当依据 ...

最新文章

  1. 埃森哲5G智慧城市报告:美国GDP将狂增5千亿
  2. unity 弹出式菜单_Java Swing JMenu和JPopupMenu:菜单和弹出式菜单
  3. Web数据存储之localStorage和sessionStorage
  4. php分解质因数,用PHP如何实现将一个整数分解为质因数的积?
  5. 绘制不规则位图方法总结,多种实现方法,全面测试比较
  6. android冻结命令,在Android上使用冻结tensorflow图中的变量
  7. linux系统shell脚本编程,Linux系统shell脚本编程(一)
  8. 【转载】文件上传命令rz和下载命令sz的安装
  9. bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割
  10. 常用SQL语句整理及示例
  11. 【转载】SI 9000 及阻抗匹配学习笔记(一)
  12. 如何批量把照片设置统一尺寸?
  13. CH341驱动安装失败解决方法
  14. 你怎么保存微博中喜欢的视频
  15. Prescan 坡道ramp 应用
  16. Beautify Panel 2 for Mac(PS人像磨皮美容插件)中文版
  17. 今天气温达到了39度 单位给买了雪糕降温
  18. 爱思考CISP证书适合哪些人学习?
  19. Pytorch加载torchvision从本地下载好的预训练模型的简单解决方案
  20. 4.0低功耗蓝牙解决方案

热门文章

  1. centos7查看当前系统时间、_CentOS7.4.1708查看系统相关信息及系统的初步优化
  2. 三角形css_使用css绘制三角形
  3. 使用t-sql语句修改表中的某些数据及数据类型。_测试开发工程师数据库篇(一)...
  4. BestCoder-Round#33
  5. [codevs 1514] 书架
  6. 中间件方法必须返回Response对象实例(tp5.1+小程序结合时候出的问题)
  7. Django中重定向页面的时候使用命名空间
  8. 做一个有梦想的咸鱼!
  9. bzoj 1146 [CTSC2008]网络管理Network
  10. 11.23月福首页30%