首页 > 编程语言 >C++语言基础|函数重载

C++语言基础|函数重载

时间:2024-08-20 15:53:48浏览次数:11  
标签:二义性 函数 int double C++ add 重载

C++语言基础|函数重载

1. 函数重载

1.1 函数重载的定义

函数重载就是两个以上的函数,取相同的函数名,但是形参的个数和类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动决定调用哪一个函数。1

1.1函数重载的示例

例如:

int max(int,int);
int max(int,int,int);
float max(float,float);
double max(double,double); 

函数重载示例:

/******************************
* 函数的重载               *
*******************************/
#include<iostream>
using namespace std;
int add(int x,int y) //函数重载
{ 
   cout<<"(int, int)\t";
   return x+y; 
}
double add(double x,double y)//函数重载
{ 
       cout<<"(double, double)\t";
       return x+y; 
}
int add(int x,double y)//函数重载
{
       cout<<"(int, double)\t";
       return int(x+y); 
}
double add(double x,int y) //函数重载
{
     cout<<"(double,int)\t";
     return x+y; 
}
int main()
{ 
     cout<<add(9,8)<<endl;
     cout<<add(9.0,8.0)<<endl;
     cout<<add(9,8.0)<<endl;
     cout<<add(9.0,8)<<endl;
     return 0;
} 

2. 函数重载注意事项

  1. 各个重载函数的返回类型可以相同,也可以不同。但如果函数名相同、形参表也相同,仅仅是返回类型不同,则是非法的。在编译时会认为是语法错误。
// C++无法区分这两个函数。因为在没有确定函数调用是对哪一个重载的函数之前,//返回类型是不知道的。 
 int add(int i1,int i2);
 float add(int f1,int f2);

  1. 确定对重载函数的哪个函数进行调用的过程称为绑定(binding), 绑定的优先次序为精确匹配、对实参的类型向高类型转换后的匹配、实参类型向低类型及相容类型转换后的匹配。
//将char型转换成int型,然后与add(int,int)绑定。 
  add('A','A'+'0');
//函数实参向(double,double)转换,然后与add(double,double)绑定。 
  add(float(8),float(9));
//实参类型为(long double, int),向低类型转化。 
  add(long double(8),9);

3 重载函数的二义性

3.1 绑定(匹配)二义性

两个重载函数,编译器不知道进行哪种类型的转换,与哪个函数绑定,这种现象就叫绑定(匹配)二义性

3.2 消除二义性

消除这种二义性的办法有:

  1. 添加重载函数定义,使调用获得精确匹配。如:增加定义add(long double,int)
  2. 将函数的实参进行强制类型的转换,使调用获得精确匹配。
    例如:调用形式可改为add(double(long double(8)),9),但改为add(long double(8),long double(9))同样出现绑定二义性。

3.3 注意事项

重载函数与带默认形参值的函数一起使用时,有可能引起二义性。
例如:

void add(int x, int y, int z=0);

当调用add(8,9)时,不知是和add(int,int)绑定,还是和add(int,int,int=0)绑定?消除这种二义性的办法是增加或减少实参个数。


  1. 本教程仅供教学使用,参考教材 :《C++语言程序设计教程》,杨进才、沈显君编著,清华大学出版社,2022年1月第4版 ↩︎

标签:二义性,函数,int,double,C++,add,重载
From: https://blog.csdn.net/benxuu/article/details/141359464

相关文章

  • C++容器概览
    容器容器是用来存储数据的序列,它们提供了不同的存储方式和访问模式。STL中的容器可以分为三类:1、序列容器:存储元素的序列,允许双向遍历。vector:动态数组,支持快速随机访问。deque:双端队列,支持快速插入和删除。list:链表,支持快速插入和删除,但不支持随机访问。2、关联容器:存......
  • C++基础
    指针#include<iostream>usingnamespacestd;intmain(){//实际变量的声明intvar=20;//指针变量的声明int*addr;//在指针变量中存储var的地址addr=&var;cout<<"var="<<var<<endl;//输出在指针变量中存储......
  • Ros2 MoveIt2 MoveGroup C++接口
     在MoveIt中,最简单的用户界面是通过 MoveGroupInterface 类。它为用户可能想要执行的大多数操作提供了易于使用的功能,特别是设置关节或姿势目标、创建运动计划、移动机器人、将对象添加到环境中以及从机器人上连接/分离对象。此接口通过ROS主题、服务和操作与 MoveGrou......
  • c++超详细教学(5)变量1
    上一节,我们讲到了换行,空格,以及运算,这一节课,我们讲一个高级一点的东西,叫变量。大家不用慌张,名字听着很玄乎,实际上很简单。上次,我给大家讲到了运算,可是如果你每次都改代码,那就显得太不专业了,为了让大家更加专业,我就给大家讲一讲变量。比如,你每次只算一个数字加一,那么我们就可......
  • c++超详细教程(2)你人生中的第一个c++代码
    上节课大家应该都学会了如何安装c++了吧(不会的,评论区留下,我亲自来教你)现在我来教你如何使用c++。首先双击点开DEVC++。是不是什么都没有(我这里调了颜色,所以大家如果是白色或其他颜色也是正确的)我来教大家如何点开代码首先点我所圈的位置就会出现点击“源代码”的选......
  • C++(rand()、srand())
    目录1.rand()函数2.srand()函数3.rand()和srand()的配合使用4.小结rand()和srand()是C++中用于生成随机数的函数。它们定义在<cstdlib>头文件中,并且在C语言中也有相同的用法。1.rand()函数功能:rand()函数用于生成一个范围在0到RAND_MAX之间的......
  • c++的时间复杂度
    前言Hello,大家好我是文宇.最近没怎么写文章了,写个教程吧.正文C++是一种高级编程语言,用于开发各种类型的应用程序,包括计算机科学中的算法和数据结构。在编写代码时,了解算法和数据结构的时间复杂度非常重要,因为它可以帮助我们估计程序的执行效率和资源利用情况。在本文中,我......
  • 【NOI】C++数据结构入门之一维数组(二)数组找数
    文章目录前言一、概念1.导入2.数组找数二、例题讲解问题类型——查找特定值问题:1154.数组元素的查找问题:1815.最后一次出现该数的位置问题类型——查找最值问题:1152.求n个数的最大值和最小值问题:1168.歌唱比赛评分问题类型——统计出现次数问题:1810.最贵商品和最......
  • Acrobat DC安装报错1603,Microsoft Visual C++2013(x64)失败
    之前顺利安装过AcrobatDC,但可能因为自动更新了,导致让我重新登录才能使用,无法再次破解。于是我卸载后重新安装,发现提示MicrosoftVisualC++2013(x64)运行安装失败。我也在网上找了教程,在Adobe官网上下载了MicrosoftVisualC++2013(x64)进行自安装,安装后也可以在设置——应......
  • 学懂C++(三十九):网络编程——深入详解 TCP 和 UDP 的区别和应用场景
    目录一、TCP的特点及应用场景1.可靠性2.流控制和拥塞控制3.有序传输4.应用场景二、UDP的特点及应用场景1.无连接2.不可靠性3.轻量级4.支持广播和多播5.应用场景三、TCP和UDP的区别四、TCP和UDP的工作原理1.TCP的工作原理三次握手数据传输......