函数重载与缺省参数
目录
一 缺省参数
缺省参数分半缺省和全缺省。
2,半缺省参数
3,全缺省参数
4.缺省参数的注意事项
二 函数重载
2 .函数重载参数类型不同强调
三 函数名修饰规则
一 缺省参数
1.缺省参数特性(备胎)
缺省参数是指我们定义函数时有给缺省值的参数,如果我们没传参数,那形参就默认用这个数,如下代码
#include<iostream>
using std::cout;
using std::endl;
void test1(int a = 2)
{cout << a << endl;
}
int main()
{test1();test1(3);return 0;
}
当我们没给test1函数传参时,cout输出为2,用的是缺省参数,若是传参了就用传的参数,缺省参数此时不起作用。

缺省参数分半缺省和全缺省。
2,半缺省参数
半缺省参数必须是从右往左,缺省参数不能间隔着定义,也就是不能year不给默认值,然后month,day都给默认值。而我们传的实参则是从右到左对应形参。
一个函数有很多参数,我们可以一部分参数给默认值,一部分不给,但是我们在函数调用的时候都得把参数给齐全,也就是说缺省参数和形参的个数和必须等于形参。
void test2(int day, int month = 5, int year = 2023)
{cout<<day<< " " << month<<" " << year<< endl;
}
int main()
{//半缺省函数test2();return 0;
}
如果像这个代码一样,day既没有缺省值又没有传参,此时就会报错说test2函数调用中的参数太少。
3,全缺省参数
是全缺省参数的函数,我们可以不传参数也可以传一部分。
void test3(int day=6, int month = 5, int year = 2023)
{cout << day << " " << month << " " << year << endl;
}
int main()
{//全缺省参数test3();test3(7);test3(7,6);test3(7,6,2024);return 0;
}
但是传参不能间断传参。必须从左往右传。(下面是错误示范)
void test3(int day=6, int month = 5, int year = 2023)
{cout << day << " " << month << " " << year << endl;
}
int main()
{test3(7,,2024);return 0;
}
4.缺省参数的注意事项
参数缺省值只能在声明或者定义的地方给,不能定义和声明都有缺省值,如果值不相同,编译器不知道用谁的,所以直接一刀切,不能同时给,一般给声明,如果给在函数定义,并且声明和定义在不同源文件,编译的时候就会发现函数少传了参数,直接就报错,就想去其它源文件找也要到链接阶段,但可惜编译就报错了不会到链接阶段。
二 函数重载
1函数重载
当我们实现功能相同的函数,比如加法函数,但是如果要处理不同类型的加法,在c语言我们只能写多个不同名函数来处理不同的数据类型,这在函数的起名字上会很麻烦,那可不可以实现多个同名函数分别针对不同的数据类型来相加,c++就设计出了函数重载,如下代码,有两个同名函数Add,但是他们的参数类型不同时(包括参数的类型,个数和顺序),我们就说这两个函数构成函数重载,当我们传参给Add的时候,编译器会主动识别参数类型,此时找到对应的函数用的参数匹配规则,但是如果Add定义在其它源文件,那就只能在链接阶段才能去找函数定义,c语言去其它源文件找函数定义是靠函数名,而但c++调用函数不是仅仅靠函数名的,因为重载函数会同名,所以是用一个修饰后的函数名,这个修饰函数名的重要部分就是参数的数据类型(具体在函数名修饰规则详说)
2 .函数重载参数类型不同强调
注意:是类型不同构成重载,不是形参名。
(1)Add(int ,double)和Add(double,int)构成函数重载,这就是参数类型不同里的顺序不一致
其它函数参数类型不同的情况都很好区分,比如个数还有形参的类型
int Add(int x, int y)
{return x + y;
}
double Add(double x, double y)
{return x + y;
}
int main()
{//缺省参数尝试test1();test1(3);//半缺省函数test2(6);//Add函数重载cout << Add(1.1,2.2) << endl;cout << Add(1, 2) << endl;
2. 如果是函数重载遇上缺省参数呢?
void func(int day=6, int month = 5, int year = 2023)
{cout << day << " " << month << " " << year << endl;
}
void func()
{cout <<"func"<< endl;
}
int main()
{func();return 0;
}
首先会构成重载,因为两个func虽然同名,但是他们参数个数是不一样的。但是全缺省函数调用会和无参函数调用有歧义,因为此时函数调用是采用参数匹配的规则,而非函数名查找,所以导致了歧义的出现。
三 函数名修饰规则
接下来我们看看在c++下两个同名的Add函数是如何区分的
double fun(double x, double y)
{return x + y;
}
int fun(int x, int y)
{return x + y;
}
在linux下,用g++编译后,再用objdump -S a.out(对应生成的可执行文件)查看汇编代码,我们可以发现,参数为两个double类型的,参数名会被用两个d修饰,

而参数为两个int类型的,函数名会被用两个i修饰,这就是c++针对识别重载函数,而制定出的函数名修饰规则,编译器看到的函数名是经过修饰的,而这个修饰成分与参数类型相关,c语言无法识别重载函数,就是因为c语言的函数名并未经过参数修饰。但是我们还发现上面两个代码的返回值不一样,那返回值是否也可以加入函数名修饰呢?我们假设可以加上,那我们调用函数的时候该咋办,按道理说得加上返回值这样才能区别调用哪个函数,那之前的代码调用函数都没有加返回值,这样几乎所有涉及到函数调用的代码在这新规则下的编译器都无法运行,这简直是一场灾难!

相关文章:
函数重载与缺省参数
目录 一 缺省参数 缺省参数分半缺省和全缺省。 2,半缺省参数 3,全缺省参数 4.缺省参数的注意事项 二 函数重载 2 .函数重载参数类型不同强调 三 函数名修饰规则 一 缺省参数 1.缺省参数特性(备胎) 缺省参数是指我们定义函数时有给缺省值的参数…...
线程引入的开销
单线程程序既不存在线程调度,也不存在同步开销,而且不需要使用锁来保证数据结构的一致性。在多个线程的调度和协调过程中都需要一定的性能开销:对于为了提升性能而引入的线程来说,并行带来的性能提升必须超过并发导致的开销。 上下…...
学生成绩管理系统
基于springboot vue实现的学生成绩管理系统 主要模块: 1)学生模块:我的成绩、成绩统计、申述管理、修改密码 2)教师模块:任务管理、对学生班级任务安排、班级学生的成绩查看、申述管理 3)管理员模块&…...
什么是关系模型? 关系模型的基本概念
关系模型由IBM公司研究员Edgar Frank Codd于1970年发表的论文中提出,经过多年的发展,已经成为目前最常用、最重要的模型之一。 在关系模型中有一些基本的概念,具体如下。 (1)关系(Relation)。关系一词与数学领域有关,它是集合基…...
shell编程-02-变量作用域
作用域 局部变量:变量只能在函数内部使用 全局变量:变量可以在当前 Shell 进程中使用 环境变量:变量还可以在子进程中使用 局部变量 函数中定义的变量默认是全局变量,在定义时加上local命令,此时该变量就成了局部变…...
C++服务器框架开发6——日志系统LogFormatter/size_t学习
该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见:[C高级教程]从零开始开发服务器框架(sylar) 上一篇:C服务器框架开发5——日志系统LogAppender/IO类“3种stream”/双感叹号 C服务器框架开发6——日志系统logFormatter/size_t学…...
MYSQL实战45讲笔记--深入浅出索引
深入浅出索引 索引的常见模型 索引模型:是哈希表、有序数组和搜索树。 区别: 哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思…...
SpringCloudAlibaba:分布式事务之Seata学习
目录 一、分布式事务基础 (一)事务 (二)本地事务 (三)分布式事务 二、Seata概述 1.Seata 的架构包含: 2.其工作原理为: 3.如果需要在 Spring Boot 应用中使用 Seata 进行分布式事务管理,主要步骤为…...
【MySQL数据库 | 第四篇】SQL通用语法及分类
目录 🤔SQL通用语法: 😊语句: 😊注释: 🤔SQL语句分类: 😊1.DDL语句: 😊2.DML语句: 😊3.DQL语言: &…...
Liskov替换原则:用了继承,子类就设计对了吗?
前言 上一篇,我们讲了开放封闭原则,想要让系统符合开放封闭原则,最重要的就是我们要构建起相应的扩展模型,所以,我们要面向接口编程。 而大部分的面向接口编程要依赖于继承实现,继承的重要性不如封装和多…...
腾讯云服务器SA3实例AMD处理器CPU网络带宽性能详解
腾讯云AMD服务器SA3实例CPU采用2.55GHz主频的AMD EPYCTM Milan处理器,睿频3.5GHz,搭载最新一代八通道DDR4,内存计算性能稳定,默认网络优化,最高内网收发能力达1900万pps,最高内网带宽可支持100Gbps。腾讯云…...
接口测试常用测试点
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 测试的策略: 接口测试也是属于功…...
Unity之OpenXR+XR Interaction Toolkit接入HTC Vive解决手柄无法使用的问题
前言 随着Unity版本的不断进化,VR的接口逐渐统一,现在大部分的VR项目都开始使用OpenXR开发了。基于OpenXR,我们可以快速适配HTC,Pico,Oculus,等等设备。 今天我们要说的问题就是,当我们按照官方的标准流程配置完OpenXR后(参考:Unity之OpenXR+XR Interaction Toolkit…...
AC变DC220V变5V小家电电源芯片-AH8652、AH8669
Q: 什么是AH8652和AH8669电源芯片? A: AH8652和AH8669都是AC变DC的电源芯片,适用于将输入的交流电压(220V)转换为5V直流电压输出,用于小家电的电源模块等应用。 AC变DC220V变5V小家电电源芯片-AH8669 Q: AH8652和AH8669的最大输…...
深度学习笔记之循环神经网络(九)GRU的反向传播过程
深度学习笔记之循环神经网络——GRU的反向传播过程 引言回顾: GRU \text{GRU} GRU的前馈计算过程场景设计 反向传播过程 T \mathcal T T时刻的反向传播过程 T − 1 \mathcal T - 1 T−1时刻的反向传播路径 T − 2 \mathcal T - 2 T−2时刻的反向传播路径 总结 引言 …...
ISFP型人格的性格缺陷和心理问题分析
ISFP人格的特征:性格敏感、为人善良、是具有有创造力的人格类型。他们喜欢追求内心的感受和情感,注重自由、个性和独立。ISFP性人格偏于内向,善于自省,对情绪敏感度高,同理心强。 每种人格类型的都有各自的优势和不足…...
HTML <dir> 标签
HTML5 中不支持 <dir> 标签在 HTML 4 中用于列出目录标题。 实例 目录列表: <dir><li>HTML</li><li>XHTML</li><li>CSS</li> </dir>浏览器支持 IEFirefoxChromeSafariOpera 所有主流浏览器都支持 <…...
leetcode 621. 任务调度器
题目链接:leetcode 621 1.题目 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个…...
线程任务的取消
如果外部代码能在某个操作正常完成之前将其置入“完成”状态,那么这个操作就可以称为可取消的(Cancellable)。取消某个操作的原因很多: 用户请求取消。用户点击图形界面程序中的“取消”按钮,或者通过管理接口来发出取消请求,例如JMX (Java …...
在线聊天项目
人事管理项目-在线聊天 后端接口实现前端实现 在线聊天是一个为了方便HR进行快速沟通提高工作效率而开发的功能,考虑到一个公司中的HR并不多,并发量不大,因此这里直接使用最基本的WebSocket来完成该功能。 后端接口实现 要使用WebSocket&…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
