函数重载主要是一个匹配问题,分为精准匹配,提升匹配和类型转换匹配三种:


精准匹配

#include<iostream>
#include "string.h"
using namespace std;void MyCout(long n)
{cout << "参数为长整形!" << endl;
}void MyCout(int n)
{cout << "参数为整形!" << endl;
}int main()
{long a = 100;int b = 200;MyCout(a);MyCout(b);system("pause");return 0;
}

想这样调用重载函数时传入的参数存在与它完全匹配的重载函数的情况称为精准匹配

提升匹配

#include<iostream>
#include "string.h"
using namespace std;void MyCout(long n)
{cout << "参数为长整形!" << endl;
}void MyCout(int n)
{cout << "参数为整形!" << endl;
}int main()
{short a = 100;//参数为short,不存在完全匹配的函数MyCout(a);system("pause");return 0;
}

向这样调用重载函数时的参数并不存在能与其完全匹配的重载函数,在参数提升为其它类型后存在唯一与其完全匹配的重载函数的情况称为提升匹配

这种提升是编译器的一个特性,比如bool 到 int、char到int、short 到int,float到double (也叫隐式转换)

类型转换匹配

类型转换匹配也叫标准转换匹配常见的有int 到double、double到int、double到long double、int到unsigned int;

#include<iostream>
using namespace std;void MyCout(int n)
{cout << "参数为整形!" << endl;
}
void MyCout(char* n)
{cout << "参数为字符指针!" << endl;
}int main()
{double a=100;MyCout(a);system("pause");return 0;
}


从上图可以看出

虽然调用函数时传入的参数是double并不存在完全匹配的重载函数,但是经过类型转换后成功匹配到了参数类型为int的重载函数。

多个匹配导致的二义性

#include<iostream>
#include "string.h"
using namespace std;void MyCout(double n)
{cout << "参数为整形!" << endl;
}void MyCout(char n)
{cout << "参数为字符指针!" << endl;
}void MyCout(unsigned int n)
{cout << "参数为double!" << endl;
}int main()
{int a=100;MyCout(a);system("pause");return 0;
}

如上图所示:

这种情况下int类型通过转换后均可以匹配参数分别为unsigned int
,double和char的重载函数这时候就产生匹配冲突也就是出现了多个匹配,这样的情况就会就导致二义性;

所以在使用函数重载时推荐使用精准匹配进行函数重载,以便避免出现二义性!避免使用如int*和char*这样的难以辨识的参数作为重载区分

函数重载导致的二义性相关推荐

  1. C++默认参数与函数重载

    C++默认参数与函数重载 一.默认参数 在C++中,可以为参数指定默认值.在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数. 默认参数的语法与使用: (1)在函数声明或定义时,直接对参数 ...

  2. C++学习笔记:(二)函数重载 常量与引用

    目录 3.函数重载 3.1 非成员函数重载 3.2 成员函数重载 3.3 函数的默认参数 3.4 内联函数 4.常量与引用 4.1 const的最初动机 4.2 const与指针 4.3 const与 ...

  3. C++成员函数重载、覆盖和隐藏的区别

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  4. C++函数重载的概念

    C++函数重载的概念 重载的起源 自然语言中,一个词可以有许多不同的含义,即该词被重载了.人们可以通过上下文来判断该词到底是哪种含义."词的重载"可以使语言更加简练.例如" ...

  5. C++基础知识 —— 内存分区模型、引用、函数重载、类和继承、this指针、友元、多态、文件操作

       参考 黑马程序员 C++课程笔记,个人理解及整理  可以使用 在线编译c++代码 来简单验证.学习代码 目录 C++核心编程 1. 内存分区模型 1.1 程序运行前 1.2 程序运行后 1.3 ...

  6. C++ |【01】面向对象基础内容、引用、函数重载等....

    文章目录 一.概述 1.简介 2.C++程序 2.1 初步接触C++ 2.2 面向过程 2.3 面向对象 2.4 面向对象的三大特性 2.4.1 封装 2.4.2 继承 2.4.3 多态 3.C++对 ...

  7. C++ 虚函数和函数重载

    函数重载 如何讲函数重载: What--函数重载是什么? why--为什么要用函数重载,没有函数重载会怎样? how--举例说明怎么使用函数重载 *************************** ...

  8. 从C语言出发新角度内核剖析C++函数重载(千字精品,附带大厂面试问题回答)

    目录 C角度引入: 函数重载: 1. 什么是函数重载: 2.函数重载的优点: 3.函数重载的特性: 剖析函数重载: 最后做一个小补充(大厂面试题): C角度引入: 首先在进行C++讲解之前我们照例先来 ...

  9. 函数重载需要注意的点

    基本概念: 作用:函数名可以相同,提高复用性 函数重载满足的条件: 1.同一作用域 2.函数名相同 3.函数参数类型不同,个数不同,顺序不同 基本规则就上面那几条,不多说了,开始难一些的东西: 1.函 ...

最新文章

  1. 关于在安装ASP.NET Forum中出现的无法排序的问题.
  2. C++绝不在构造和析构过程中调用virtual函数
  3. C++ delete与 delete []区别
  4. idea中git打tag(亲测)
  5. BZOJ 1070 修车
  6. 【Spring】SpringMVC之REST编程风格
  7. 噪音声压和声功率的区别_南昌汽车隔音,深入了解汽车噪音的来源、危害以及解决方案...
  8. 解压的mysql_10分钟教你解决安装解压版mysql出现的各种问题
  9. Wordpress SEO robots
  10. Java的设计模式 之 简单的工厂模式(一)
  11. gogs 创建新的仓库
  12. PT建站源码(PT服务器原程序)汇总 by 乱世狂人
  13. 简单提高MIDI音量的方法
  14. linux误删除文件恢复
  15. VMware 虚拟化中:厚置备延迟置零、厚置备置零、Thin Provision三个的区别
  16. error C251: illegal octal digit 错误提示
  17. 第一篇:详细介绍三次握手和四次挥手
  18. websocket连接不成功的原因
  19. python硬件驱动_从零开始:手把手教你安装深度学习操作系统、驱动和各种python库!...
  20. ubuntu 必备软件

热门文章

  1. 声明式事务、SpringMVC详解
  2. c语言QQ管理系统四百条,C语言程序设计论文-工会成员信息管理系统.doc
  3. 蓝牙(BLE)自动配对
  4. RxJava 学习笔记(八) --- Combining 结合操作
  5. 损失函数总结 : 评价模型好坏指标准确率 和 稳定性
  6. Virtual Box报错VT-x is not available (VERR_VMX_NO_VMX)--大踩坑(二)
  7. SQL UCASE() 函数、 LCASE() 函数
  8. 如何用idea比对代码差异
  9. Kaggle -Linear Regression with Time Series
  10. math_(函数数列)极限的含义误区和符号梳理/邻域去心邻域邻域半径