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,一经查实,立即删除!

相关文章

LeetCode-每日一题-将数组和减半的最少操作次数

2208. 将数组和减半的最少操作次数 提示 中等 49 相关企业 给你一个正整数数组 nums 。每一次操作中&#xff0c;你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。&#xff08;注意&#xff0c;在后续操作中你可以对减半过的数继续执行操作&#xff09; 请你返…

【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…

React 中的受控组件

React 中的受控组件是由 React 组件管理其值的表单组件。它们的值受到 React 组件状态的控制&#xff0c;更新时会通过回调函数进行数据的处理。 受控组件的特点包括&#xff1a; 值由状态控制&#xff1a;受控组件的值是通过 React 组件的状态进行控制和更新的。通过事件处理…

STM32 串口实验(学习一)

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

Linux搭建实验环境搭建(nginx,mysql,java.tomcat)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

KMP算法的及其原理

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

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

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

测牛学堂:车载测试面试总结之语音助手相关

车载语音助手的工作原理&#xff1f; 语音助手的工作原理总结下来可以分为4个步骤&#xff1a; 1 通过麦克风采集驾驶员的语音指令 2将语音信号转换为数字信号 3过语音识别技术将语音指令转换为计算机可以理解的指令 4 通过语音合成技术将计算机的回应转换为语音输出 车载…

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…

vuex和redus的异同

生态系统和语言&#xff1a;Vuex是为Vue.js框架设计的状态管理库&#xff0c;而Redux是一个独立的JavaScript状态管理库&#xff0c;可以与多种框架&#xff08;如React、Angular等&#xff09;一起使用。 架构&#xff1a;Vuex是基于Flux架构的一种实现&#xff0c;而Redux是…

QT 脚本QScriptValue返回QList<QString>

在 QT 脚本中&#xff0c;可以使用 QScriptValue 类来返回 QList<QString> 类型的值。首先&#xff0c;你需要创建一个 QList<QString> 对象&#xff0c;然后将其转换为 QScriptValue 类型。 下面是一个示例代码&#xff1a; // 创建 QList<QString> 对象 …

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…

运维高级学习---MySQL备份恢复

数据库备份&#xff0c;数据库为school&#xff0c;素材如下 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );创建sco…

【周赛第66期】题目、解答与疑义

目录 感想 判断题1.单选题1.2.&#xff08;有疑义&#xff09; 填空题1. 编程题1.路灯亮度题目题解答案 2.题目题解答案 感想 &#xff08;吐槽&#xff09; 在线IDE真不好用&#xff0c;不说不如CLion&#xff0c;抄一下leetcode的也好啊…… 希望支持比赛时实时看别人通过了…

MATLAB 创建神经网络模型的patternnet和newff函数区别

patternnet和newff都是在MATLAB中用于创建人工神经网络的函数&#xff0c;但它们有一些区别和适用场景。 网络类型&#xff1a; patternnet&#xff1a;用于创建多层感知器&#xff08;MLP&#xff09;类型的神经网络&#xff0c;MLP是一种前馈神经网络&#xff0c;由输入层、若…

Jupyter(CPP内核) || 如何在使用xeus-cling时添加第三方库

国内的搬运真是管杀不管埋。在CSDN上找了半天没有找到在xeus-cling添加第三方库的&#xff0c;最后还是只能自己到处去看英文文档。 先贴上英文文档的链接&#xff1a;Introduction — xeus-cling documentation 构建二进制文件时&#xff0c;通常在构建工具中指定包含目录和第…

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

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

threadLocal如何支持线程池获取

问题: ThreadLocal默认不支持子线程获取&#xff0c;而InheritableThreadLocal支持子线程获取threadLocal值&#xff0c;但是如果使用线程池&#xff0c;核心个数为1则子线程会获取到上一个threadLocal的值。 解决&#xff1a; 1.引入transmittable-thread-local jar <d…