C++ 函数重载

1.函数重载的概念

在C++中可以为两个或两个以上的函数提供相同的函数名称,只要参数类型不同,或参数类型相同而参数个数不同,称为函数重载。

在C语言中实现int,char,double类型的比较大小函数:

int my_max_i(int a,int b){return a > b ? a : b;}
char my_max_ch(char a,char b){return a > b ? a : b;}
double my_max_d(double a,double b){return a > b ? a : b;}

这些函数都执行了相同的一般性动作,都返回两个形参中的最大值。

在C++中使用函数重载来实现int,char,double类型的比较大小函数:

#include<iostream>
using namespace std;int my_max(int a,int b)
{return a > b ? a : b;
}
char my_max(char a, char b)
{return a > b ? a : b;
}
double my_max(double a, double b)
{return a > b ? a : b;
}
int main()
{int ix = my_max(12, 23);cout << "ix=" << ix << endl;char chx = my_max('a', 'b');cout << "chx=" << chx << endl;double dx = my_max(12.23, 34.45);cout << "dx=" << dx << endl;return 0;
}

输出结果为:
在这里插入图片描述
编译器的工作:
当一个函数名在同一个域中被声明多次时,编译器按如下步骤解释第二个(以及后续的)的声明。
如果两个函数的参数表中参数的个数或类型或顺序不同,则认为这两个函数是重载。
例如:

//重载函数
void print(int a, int b);
void print(char a,char b);
2.判断函数重载的规则

(1)如果两个函数的参数表相同,但是返回类型不同,会被标记编译错误,原因是函数的重复声明。

//错误
int my_max(int a, int b){}
unsigned int my_max(int a, int b) {}

只有返回类型不同,函数的返回类型不足以区分两个重载函数,无法重载仅按返回类型区分的函数
(2)参数表的比较过程与形参名无关。

//错误
int my_add(int a,int b);
int my_add(int x,int y);

形参名不同不可以构成函数重载
(3)如果在两个函数的参数表中,只有缺省实参不同,则第二个声明被视为第一个声明的重复声明。
只有缺省参数不同不可以构成函数重载

void Print(int*br,int n);
void Print(int *br,int len=10);

(4)typedef名为现有的数据类型提供了一个替换名,它并没有创建一个新类型,因此,如果有两个函数参数表的区别只在于一个使用了typedef,而另一个使用了与typedef相应的类型,则该参数表被视为相同的参数表,从而不可以构成函数重载。下列Print()的两个函数声明被视为具有相同的参数表,第二个声明导致编译时刻错误,因为虽然它声明了相同的参数表。

//错误
typedef unsigned int u_int;//typedef 并不引入一个新类型
//错误: 相同参数表,相同返回类型
int Print(u_int a);
int Print(unsigned int b);

(5)当一个参数类型是const 或volatile 修饰时,如果形参是按值传递方式定义,在识别函数声明是否相同时并不考虑const 和volatile 修饰符。

// 声明同一函数
void f( int );
void f( const int );

参数是const 这只跟函数的定义有关系,它意味着函数体内的表达式不能改变参数的值,但是对于按值传递的参数,这对函数的用户是完全透明的,用户不会看到函数对按值传递的实参的改变。当实参被按值传递时,将参数声明为const之后就不会改变可以被传递给该函数的实参种类,任何int 型的实参都可以被用来调用函数f(const int) ,因为两个函数接受相同的实参集,所以刚才给出的两个声明并没有声明一个重载函数,然后将函数f()可以定义为:

void f( int i ) { }
void f( const int i ) { }

然而在同一个程序中同时提供这两个定义将产生错误,因为这两个定义把一个函数定义了两次,还是没有构成函数重载。
(6)当一个形参类型有const或者volatile修饰时,如果形参定义指针或引用时,在识别函数声明是否相同时,就要考虑const和volatile修饰符。

//下列两个声明声明了不同的函数
void fun(int *p){}
void fun(const int *p){}//下列两个声明声明了不同的函数
void fun(int &a){}
void fun(const int &a){}

(7)注意函数调用的二义性
如果在两个函数的参数表中,形参类型相同,而形参个数不同,形参默认值将会影响函数的重载。

void fun(int a){}void fun(int a,int b){}void fun(int a,int b=10){}

(8)函数重载解析步骤
①确定函数调用考虑的重载函数的集合,确定函数调用中实参表的属性。
②从重载函数集合中选择函数,该函数可以在(给出实参个数和类型)的情况下调用函数。
③选择与调用最匹配的函数。

3.函数重载的规则

函数名称必须相同。
参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
函数的返回类型可以相同也可以不相同。
仅仅返回类型不同不足以成为函数的重载。

4.函数重载的作用

重载函数通常用来在同一个作用域内用同一个函数名去命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Kubernetes资源篇】ingress-nginx最佳实践详解

文章目录 一、Ingress Controller理论知识1、Ingress Controller、Ingress简介2、四层代理与七层代理的区别3、Ingress Controller中封装Nginx&#xff0c;为什么不直接用Nginx呢&#xff1f;4、Ingress Controller代理K8S内部Pod流程 二、实践&#xff1a;部署Ingress Control…

STM32 串口实验(学习一)

本章将实现如下功能&#xff1a;STM32通过串口和上位机对话&#xff0c;STM32在收到上位机发过来的字符串后&#xff0c;原原本本返回给上位机。 STM32 串口简介 串口作为MCU的重要外部接口&#xff0c;同时也是软件开发重要的调试手段&#xff0c;其重要性不言而喻。现在基本…

KMP算法的及其原理

KMP算法 首先 我们先了解一下 KMP算法的作用 str1 和str2 字符串 如果str1中包含str2 那么返回头位置 如果不包含返回-1 首先 我们先加入一个概念: 有一个next数组 next[i]的值为 str2 中 以i-1位置为结尾的字符串中 最长相同前缀后缀为多长(相同前缀后缀 不是对称 aba 中相…

uniapp 小程序如何从主包页面跳转到分包页面

在uniapp开发小程序的时候&#xff0c;“分包”概念一定要提前了解下&#xff0c;具体我就不多说了&#xff0c;自己看下关网的相关配置。 那么&#xff0c;如果从主包页面&#xff0c;跳转至分包的页面呢&#xff1f;如图所示 我的页面->详情页 在我的页面创建好自己的链…

ARM--LED灯点亮

LED1,LED2,LED3亮灯 .text .global _start_start: /**********LED1点灯--->PE10**************//*初始化RCC章节*/通过RCC_MP_AHB4ENSETR寄存器,使能GPIOs组控制器 0x500000A28[4] 1RCC_INIT: E组和F组一起使能ldr r0,0x50000A28 ldr r1,[r0]orr r1,r1,#(0x3 << 4)s…

vue3+ts+elementui-plus二次封装树形表格实现不同层级展开收起的功能

一、TableTreeLevel组件 <template><div classmain><div class"btns"><el-button type"primary" click"expandLevel(1)">展开一级</el-button><el-button type"primary" click"expandLevel(2…

13年测试老鸟,接口性能测试总结整理,据说这是全网最全的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试按照不同…

【云原生系列】openstack搭建过程及使用

目录 搭建步骤 准备工作 正式部署OpenStack 安装的过程 安装组件如下 登录页面 进入首页 创建实例步骤 上传镜像 配置网络 服务器配置 dashboard配置 密钥配置免密登录 创建实例 绑定浮动ip 免密登录实例 搭建步骤 准备工作 1.关闭防火墙和网关 systemctl dis…

抖音SEO源码开发指南:介绍如何开发抖音SEO源码的基本步骤和要点。

一、 抖音SEO源码开发指南&#xff1a; 确定目标&#xff1a;首先要明确开发抖音SEO源码的目标是什么&#xff0c;是提高搜索排名还是增加用户量等。根据不同的目标来制定开发策略和思路。 分析竞争&#xff1a;对于同类产品&#xff0c;要进行竞争分析&#xff0c;了解对手的…

在Mac系统下搭建Selenium环境并驱动Chrome浏览器

本文带领那些使用Mac的童鞋们实现Selenium驱动Chrome浏览器&#xff0c;虽然会有坑&#xff0c;但是我们可以凭借敏捷的身手躲过。下面就开始吧&#xff1a; 安装selenium 打开终端 ->pip安装&#xff08;安装命令&#xff1a;pip3 install selenium&#xff09; 安装浏览…

如何在 SwiftUI 中使用 Touch ID 和 Face ID?

1. 需要通过指纹&#xff0c;面容认证后才能打开 App 2. 添加配置 需要向 Info.plist 文件中添加一个配置&#xff0c;向用户说明为什么要访问 添加 Privacy - Face ID Usage Description 并为其赋予值 $(PRODUCT_NAME) need Touch Id or Face ID permission for app lock 3. …

HTML不常用但是好用的标签

sub sup <p>这个文本包含 <sub>111</sub>文本。</p> <p>这个文本包含 <sup>上标</sup> 文本。</p>下标文本将会显示在当前文本流中字符高度的一半为基准线的下方&#xff0c;但是与当前文本流中文字的字体和字号都是一样的。…

Git竞合处理

Gitee新建一个代码仓库&#xff0c;clone到本地&#xff0c;模拟竞合的情况出现 这里仓库已经配好了ssh&#xff0c;所以没有添加账户绑定的步骤 clone到本地 模拟A同学Clone代码 git clone 项目地址新建一个文件&#xff0c;上传到仓库 push到仓库 代码仓库已经可以看到了…

HEVC网络适配层介绍

h265 的分层结构 分层结构的目的 ○ 网络类型多种多样&#xff0c;不同的网络环境具有不同的特性&#xff0c;压缩视频在其中进行传输必然会受到影响&#xff1b;比如不同网络的 MTU 有所不同&#xff1b; ○ 不同的应用场景对视频有不同的需求&#xff0c;视频业务会喜用不…

springboot快速整合腾讯云COS对象存储

1、导入相关依赖 <!--腾讯云COS--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.0.1</version></dependency><dependency><groupId>com…

【矩特征】图像矩特征

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 cv2.moments() 矩特征 1. 正文 (1). 空间矩 零阶矩&#xff1a;m00一阶矩&#xff1a;m10,m01二阶矩&#xff1a;m20,m11,m02三阶矩&#xff1a;m30,m…

三维虚拟电子沙盘数字沙盘态势推演教程第12课

三维虚拟电子沙盘数字沙盘态势推演教程第12课 设置system.ini 如下内容 Server122.112.229.220 userGisTest Passwordchinamtouch.com 该数据库中只提供 成都市火车南站附近的数据请注意&#xff0c;104.0648,30.61658 SDK中自带了一套 导航系统&#xff0c;用的是比较详细的…

3. Spring 更简单的读取和存储对象(五大类注解 方法注解)

目录 1. 存储 Bean 对象 1.1 配置扫描路径 1.2 添加注解存储 Bean 对象 1.2.1 Controller&#xff08;控制器存储&#xff09; 1.2.2 Service&#xff08;服务存储&#xff09; 1.2.3 Repository&#xff08;仓库存储&#xff09; 1.2.4 Component&#xff08;组件存储&…

java项目之网络视频播放器(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的网络视频播放器。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&a…

ElementUI tabs标签页样式改造美化

今天针对ElementUI的Tabs标签页进行了样式修改&#xff0c;更改为如下图所属的样子。 在线运行地址&#xff1a;JSRUN项目-ElementUI tabs标签页样式改造 大家如果有需要可以拿来修改使用&#xff0c;下面我也简单的贴上代码&#xff0c;代码没有注释&#xff0c;很抱歉&#x…