当前位置: 首页 > news >正文

函数重载与缺省参数

一 缺省参数 

缺省参数分半缺省和全缺省。

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&#xff0c;半缺省参数 3&#xff0c;全缺省参数 4.缺省参数的注意事项 二 函数重载 2 .函数重载参数类型不同强调 三 函数名修饰规则 一 缺省参数 1.缺省参数特性(备胎) 缺省参数是指我们定义函数时有给缺省值的参数&#xf…...

线程引入的开销

单线程程序既不存在线程调度&#xff0c;也不存在同步开销&#xff0c;而且不需要使用锁来保证数据结构的一致性。在多个线程的调度和协调过程中都需要一定的性能开销&#xff1a;对于为了提升性能而引入的线程来说&#xff0c;并行带来的性能提升必须超过并发导致的开销。 上下…...

学生成绩管理系统

基于springboot vue实现的学生成绩管理系统 主要模块&#xff1a; 1&#xff09;学生模块&#xff1a;我的成绩、成绩统计、申述管理、修改密码 2&#xff09;教师模块&#xff1a;任务管理、对学生班级任务安排、班级学生的成绩查看、申述管理 3&#xff09;管理员模块&…...

什么是关系模型? 关系模型的基本概念

关系模型由IBM公司研究员Edgar Frank Codd于1970年发表的论文中提出&#xff0c;经过多年的发展&#xff0c;已经成为目前最常用、最重要的模型之一。 在关系模型中有一些基本的概念&#xff0c;具体如下。 (1)关系(Relation)。关系一词与数学领域有关&#xff0c;它是集合基…...

shell编程-02-变量作用域

作用域 局部变量&#xff1a;变量只能在函数内部使用 全局变量&#xff1a;变量可以在当前 Shell 进程中使用 环境变量&#xff1a;变量还可以在子进程中使用 局部变量 函数中定义的变量默认是全局变量&#xff0c;在定义时加上local命令&#xff0c;此时该变量就成了局部变…...

C++服务器框架开发6——日志系统LogFormatter/size_t学习

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见&#xff1a;[C高级教程]从零开始开发服务器框架(sylar) 上一篇&#xff1a;C服务器框架开发5——日志系统LogAppender/IO类“3种stream”/双感叹号 C服务器框架开发6——日志系统logFormatter/size_t学…...

MYSQL实战45讲笔记--深入浅出索引

深入浅出索引 索引的常见模型 索引模型&#xff1a;是哈希表、有序数组和搜索树。 区别&#xff1a; 哈希表是一种以键 - 值&#xff08;key-value&#xff09;存储数据的结构&#xff0c;我们只要输入待查找的值即 key&#xff0c;就可以找到其对应的值即 Value。哈希的思…...

SpringCloudAlibaba:分布式事务之Seata学习

目录 一、分布式事务基础 &#xff08;一&#xff09;事务 &#xff08;二&#xff09;本地事务 &#xff08;三&#xff09;分布式事务 二、Seata概述 1.Seata 的架构包含: 2.其工作原理为: 3.如果需要在 Spring Boot 应用中使用 Seata 进行分布式事务管理,主要步骤为…...

【MySQL数据库 | 第四篇】SQL通用语法及分类

目录 &#x1f914;SQL通用语法&#xff1a; &#x1f60a;语句&#xff1a; &#x1f60a;注释&#xff1a; &#x1f914;SQL语句分类&#xff1a; &#x1f60a;1.DDL语句&#xff1a; &#x1f60a;2.DML语句&#xff1a; &#x1f60a;3.DQL语言&#xff1a; &…...

Liskov替换原则:用了继承,子类就设计对了吗?

前言 上一篇&#xff0c;我们讲了开放封闭原则&#xff0c;想要让系统符合开放封闭原则&#xff0c;最重要的就是我们要构建起相应的扩展模型&#xff0c;所以&#xff0c;我们要面向接口编程。 而大部分的面向接口编程要依赖于继承实现&#xff0c;继承的重要性不如封装和多…...

腾讯云服务器SA3实例AMD处理器CPU网络带宽性能详解

腾讯云AMD服务器SA3实例CPU采用2.55GHz主频的AMD EPYCTM Milan处理器&#xff0c;睿频3.5GHz&#xff0c;搭载最新一代八通道DDR4&#xff0c;内存计算性能稳定&#xff0c;默认网络优化&#xff0c;最高内网收发能力达1900万pps&#xff0c;最高内网带宽可支持100Gbps。腾讯云…...

接口测试常用测试点

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 测试的策略&#xff1a; 接口测试也是属于功…...

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的电源芯片&#xff0c;适用于将输入的交流电压&#xff08;220V&#xff09;转换为5V直流电压输出&#xff0c;用于小家电的电源模块等应用。 AC变DC220V变5V小家电电源芯片-AH8669 Q: AH8652和AH8669的最大输…...

深度学习笔记之循环神经网络(九)GRU的反向传播过程

深度学习笔记之循环神经网络——GRU的反向传播过程 引言回顾&#xff1a; GRU \text{GRU} GRU的前馈计算过程场景设计 反向传播过程 T \mathcal T T时刻的反向传播过程 T − 1 \mathcal T - 1 T−1时刻的反向传播路径 T − 2 \mathcal T - 2 T−2时刻的反向传播路径 总结 引言 …...

ISFP型人格的性格缺陷和心理问题分析

ISFP人格的特征&#xff1a;性格敏感、为人善良、是具有有创造力的人格类型。他们喜欢追求内心的感受和情感&#xff0c;注重自由、个性和独立。ISFP性人格偏于内向&#xff0c;善于自省&#xff0c;对情绪敏感度高&#xff0c;同理心强。 每种人格类型的都有各自的优势和不足…...

HTML <dir> 标签

HTML5 中不支持 <dir> 标签在 HTML 4 中用于列出目录标题。 实例 目录列表&#xff1a; <dir><li>HTML</li><li>XHTML</li><li>CSS</li> </dir>浏览器支持 IEFirefoxChromeSafariOpera 所有主流浏览器都支持 <…...

leetcode 621. 任务调度器

题目链接&#xff1a;leetcode 621 1.题目 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行&#xff0c;并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间&#xff0c;CPU 可以完成一个…...

线程任务的取消

如果外部代码能在某个操作正常完成之前将其置入“完成”状态&#xff0c;那么这个操作就可以称为可取消的(Cancellable)。取消某个操作的原因很多&#xff1a; 用户请求取消。用户点击图形界面程序中的“取消”按钮&#xff0c;或者通过管理接口来发出取消请求,例如JMX (Java …...

在线聊天项目

人事管理项目-在线聊天 后端接口实现前端实现 在线聊天是一个为了方便HR进行快速沟通提高工作效率而开发的功能&#xff0c;考虑到一个公司中的HR并不多&#xff0c;并发量不大&#xff0c;因此这里直接使用最基本的WebSocket来完成该功能。 后端接口实现 要使用WebSocket&…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...