函数重载与缺省参数
目录
一 缺省参数
缺省参数分半缺省和全缺省。
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&…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
