【C++起飞之路】初级——缺省参数、函数重载、引用

news2024/11/23 13:55:39

C++:函数重载、引用

  • 一、缺省参数🛫
    • 1.1 🚝什么是缺省参数
    • 1.2 🚝缺省参数的分类
      • a. 全缺省参数
      • b. 半缺省参数(部分缺省参数)
    • 1.3 🚝注意事项
  • 二、函数重载🛫
    • 2.1 🚝什么是函数重载
    • 2.2 🚝演示
    • 2.3 🚝用法注意事项
      • a) 不能只有返回值类型不同
      • b) 类型顺序相同,形参名字不同不构成函数重载
      • c) 相同类型数据,顺序不同不构成函数重载
    • 2.4🚝 const 形参
  • 三、引用🛫
    • 3.1🚝 什么是引用
    • 3.2 🚝引用的定义
    • 3.3🚝 特性
      • a. 在定义时必须初始化
      • b. 引用类型的初始值必须是一个对象(不能是常量)
      • c. 一个变量可以有多个引用
      • d. 一旦引用一个实体,再不能引用其他实体
    • 3.4🚝 常引用
      • a. const 修饰的常变量
      • b. 常量
      • c. 不同类型
    • 3.5🚝 引用与指针的区别

一、缺省参数🛫

1.1 🚝什么是缺省参数

缺省参数是 声明 或 定义 函数时为函数的参数指定一个缺省值
在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

缺省参数使用主要规则:调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数。

👉C++中可以给函数的形参赋值:

在这里插入图片描述
这就是给函数的参数指定一个缺省值
如果不进行传参,就会直接使用缺省值
如果传参,则使用传过来的参数

1.2 🚝缺省参数的分类

a. 全缺省参数

全缺省参数:所有参数都有缺省值
在这里插入图片描述规律见图👆
如果要传参,传递的参数从函数第一个参数开始传递,依次传递

我们可能要问了,如果我只想传递第二个参数(跳过前面的参数直接传后面的),行不行呢?
比如:
在这里插入图片描述 当然是错误的,全缺省传参的时候必须从左往右连续的传,不能 “跳着” 传 !

b. 半缺省参数(部分缺省参数)

半缺省参数:函数中的所有参数最右边往左连续地缺省一部分(当然也可以省一个)

在这里插入图片描述省了,但没完全省

在这里插入图片描述

举个栗子:
错误①
在这里插入图片描述
部分缺省时就不能不传参了

错误②:

在这里插入图片描述
函数中的所有参数最右边往左连续地缺省
不可以从除倒数第一个参数以外的参数开始缺省:

在这里插入图片描述

正确用法:

在这里插入图片描述

1.3 🚝注意事项

    1. 半缺省参数必须从右往左依次来给出,不能间隔着给
    1. 缺省参数不能在函数声明和定义中同时出现
    1. 缺省值必须是 常量或者全局变量
    1. C++可以,但是C语言不支持(编译器不支持)

注意第二点:如果声明与定义中同时缺省,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值

声明时给缺省值,定义的时候不能给

二、函数重载🛫

—— “一词多义” ,即一个函数有多个 “ 意思 ”

2.1 🚝什么是函数重载

定义:如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载( overloaded )函数。

函数重载是函数的一种特殊情况

C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表( 参数个数类型类型顺序)不同,常用来处理实现功能类似数据类型不同的问题

注意:
①函数重载不能只有函数返回值类型不同
②main函数不能重载

2.2 🚝演示

比如下面我们定义几个Print函数:
在这里插入图片描述

这些函数接受的形参类型不一样,但是执行的操作类似。功能相同

当调用这些函数时,编译器会根据传递的实参类型 推断想要的是哪个函数:

在这里插入图片描述
👉函数的名字仅仅是让编译器知道它调用的是哪个函数

而函数重载可以在一定程度上减轻程序员给函数起名字、记名字的负担。

2.3 🚝用法注意事项

a) 不能只有返回值类型不同

在这里插入图片描述

b) 类型顺序相同,形参名字不同不构成函数重载

在这里插入图片描述
要求类型的顺序不同,不是形参名字的顺序

比如:
在这里插入图片描述
到底应该调用哪一个?
无法确定!
会产生歧义

c) 相同类型数据,顺序不同不构成函数重载

在这里插入图片描述
与b)类似

b)、c)归结起来就是:形参的名字仅仅起到帮助记忆的作用,有没有它并不影响形参列表的内容

像这样不写形参的名字也是编的过的:
在这里插入图片描述

2.4🚝 const 形参

顶层const不影响传入函数的对象。

一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来

比如:

在这里插入图片描述

第二行重复声明了int Add(int a);


在这里插入图片描述
第6行重复声明了int Add(int* a);

在这两组函数声明中,每一组的第二个声明和第一个声明是等价的

三、引用🛫

3.1🚝 什么是引用

引用不是新定义一个变量,而是给已存在变量了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间

引用即别名:引用并非对象,相反的,它只是为一个已经存在的  对象所起的另外一个名字

语法:类型& 引用变量名(对象名) = 引用实体

📘例如:

	int a = 10;
	int& b = a;

通过调试观察引用跟原来变量的关系↓
在这里插入图片描述
在这里插入图片描述
➡印证了概念中所说的:编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间

3.2 🚝引用的定义

允许在一条语句中定义多个引用,其中每个引用标识符都必须以& 开头

int main()
{
	int i = 1024, i2 = 2048;//i和j都是int
	int& r = i, r2 = i2;//r是引用,与i绑定;r2是int
	int i3 = 1024, &ri = i3;//i3是int;ri是引用,与i3绑定
	int& r3 = i3, & r4 = i2;//r3\r4都是引用
	return 0;
}

3.3🚝 特性

a. 在定义时必须初始化

一般在初始化变量的时候,初始值会被拷贝到新建的对象中。But,定义引用时,程序把引用和它的初始值绑定在一起, 而不是将初始值拷贝给引用。

👉👉👉因此,一旦初始化完成,引用就跟它的初始值对象一直绑定在一起,以后就再也分不开了(即无法让这个引用绑定另一个对象了~),故引用必须初始化!在这里插入图片描述

b. 引用类型的初始值必须是一个对象(不能是常量)

除了两种例外情况,其他所有引用的类型都要和与之绑定的对象严格匹配。What’s more,引用只能绑定在对象上 不能与字面值 or 某个表达式的计算结果绑定在一起
在这里插入图片描述

c. 一个变量可以有多个引用

通俗一点来说,别名可以不只有一个。

就好比孙悟空的别名有孙行者、心猿、金公、斗战胜佛、齐天大圣等等

在这里插入图片描述对别名取别名也是允许的,例子见《4.1 什么是引用》的第一张图

d. 一旦引用一个实体,再不能引用其他实体

在这里插入图片描述在这里插入图片描述

b = x只是赋值而已,b绑定的仍是a(并不是让 b 变成 x 的别名

3.4🚝 常引用

a. const 修饰的常变量

	const int a = 10;
	int& ra = a; 
	const int& cra = a;//正确

在这里插入图片描述在这里插入图片描述加了const限定,使得 a 不能被修改(权限为“ 只读 ”),那么a的引用也不可以被修改。a 权限是只读,但是引用 ra 没有加const修饰,权限为“ 可读可写 ”(a的引用权限放大了,会报错)

所以可以使ra的权限变成和 a 相同的,即加上 const 修饰 ra (见上图),就可以消除这个error了

b. 常量

	int& b = 10; // 该语句编译时会出错,b为常量
	const int& rb = 10;//正确

在这里插入图片描述解释跟a. const 修饰的常变量类似

c. 不同类型

	double d = 12.34;
	int& rd = d; // 该语句编译时会出错,类型不同
	const int& rd = d;//会给出警告,但不是error

在这里插入图片描述double变int会丢失精度

3.5🚝 引用与指针的区别

语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

在这里插入图片描述

这里我们不需要理解引用底层的实现(引用的底层其实也是用指针实现的)
只明确引用不开辟空间就行了

引用和指针的不同点:

    1. 引用概念上定义一个变量的别名,指针存储一个变量地址
    1. 引用在定义时必须初始化,指针没有要求
    1. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
      一个同类型实体
    1. 没有NULL引用,但有NULL指针
    1. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
      位平台下占4个字节)
    1. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
    1. 有多级指针,但是没有多级引用
    1. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
    1. 引用比指针使用起来相对更安全

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

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

相关文章

时间复杂度:根号n一般来说大于log(n)

f ( x ) x − l o g 2 x f(x)\sqrt{x}-log_2 x f(x)x ​−log2​x 对这函数求导后,比较分母大小,可以得到结论 f ( x ) f(x) f(x)先减后增,分界点为 x 4 ( l n 2 ) 2 x \frac{4}{(ln2)^2} x(ln2)24​ f ( x ) f(x) f(x)的图像如下所示&a…

PPT技能之文字格式,转身的文字这样做

只要用PPT,一定需要设置文字格式。好的文字格式,给人惊艳的感觉,是一种愉悦的享受。 你的关注,是我最大的动力!你的转发,我的10W!茫茫人海有你的支持,给我无限动力。 1、字体。 按…

什么是Java中的阻塞队列?它有什么作用?

在Java中,阻塞队列是一种特殊的队列,它可以在队列为空或队列已满时阻塞添加或移除元素的操作。阻塞队列通常用于多线程编程中,可以帮助我们更加方便地进行线程通信和协作。在本文中,我将从面试的角度,详细讲解Java中的…

在线办公时代,如何选择合适的云办公软件?

文章目录 在线办公时代,如何选择合适的云办公软件?在线文档石墨文档腾讯文档飞书文档 远程控制ToDesk向日葵 会议协同腾讯会议ZOOM 总结 在线办公时代,如何选择合适的云办公软件? 随着数字经济的发展和疫情的影响,云办…

100天精通Python(可视化篇)——第87天:matplotlib绘制不同种类炫酷雷达图参数说明+代码实战(普通、堆叠、多个、矩阵、极坐标雷达图)

文章目录 专栏导读1. 雷达图1)介绍2)参数说明 2. 基本雷达图3. 堆叠雷达图4. 六边形战士5. 多个雷达图6. 雷达图矩阵7. 极坐标雷达图 专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础…

做一名活动策划是什么体验

在一些不了解的人眼中,活动策划就是那种外表光鲜亮丽,气场十足,眼神犀利,跷着二郎腿,情绪饱满的完成一场又一场的完美的秀。 好像确实是这样,但是你们又知不知道这背后的一切我们活动策划到底付出了什么&a…

SpringMVC的三大功能

目录 一、初识SpringMVC 1.1 MVC的定义 1.2 MVC和SpringMVC的关系是什么? 1.3 SpringMVC的重要性 二、Spring MVC的三大功能 2.1 连接功能 2.1.1 RequestMapping 注解介绍 2.1.2 GetMapping 和 PostMapping 2.2 获取参数功能 2.2.1 传递普通参数 2.2.2 传递对象 2…

【K8s】Ingress的使用

文章目录 一、Ingress介绍1、Ingress的作用2、Ingress工作流程 二、Ingress使用1、测试数据准备2、HTTP代理3、HTTPS代理 一、Ingress介绍 1、Ingress的作用 上一章中,NotePort和LoadBalancer类型的Service可给集群外部机器提供访问,但这两种类型都有缺…

JavaScript数组

1.数组是什么 2.数组的基本使用 3.操作数组 4.数组案例 一、数组是什么? 1.数组(Array)是一种可以按顺序保存数据的数据类型2.为什么要使用数组?例如:如果想保存一个班所有同学的姓名怎么办?场景:如果有多个数据可以用…

vue3中ts定义对象,pinia中使用ts定义状态对象

文章目录 引入reactive中使用数组reactive中定义对象类型pinia中定义状态对象 引入 用惯了js,突然使用ts属实有点不习惯,这里介绍一下自己在vue3中使用ts初始化内容的一些小技巧 reactive中使用数组 例如下面所示的代码,我们就像写js代码一…

数组a与数组b作内积:即a和b所有对应位置两元素相乘 将所有的相乘结果(积)求和 numpy.inner(a,b)

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 数组a与数组b作内积: 即a和b所有对应位置两元素相乘 将所有的相乘结果(积)求和 numpy.inner(a,b) [太阳]选择题 请问关于以下代码的输出结果是? import numpy as np …

招银网络科技-2024届暑期实习-Java后端开发

目录 1.SpringBoot 中的 SpringBootApplication注解的作用是什么?2.SpringBoot 中你们是如何加载配置信息的?3.RabbitMQ 如何保证消息不丢失?4.如果消费者这边消费到一半宕机了怎么办?5.RabbitMQ 如何保证消息没有被重复消费&…

C语言函数大全-- w 开头的函数(3)

C语言函数大全 本篇介绍C语言函数大全-- w 开头的函数 1. wcsdup 1.1 函数说明 函数声明函数功能wchar_t *wcsdup(const wchar_t *str);用于复制宽字符字符串 参数: str : 待复制的宽字符串 返回值: 如果成功复制,则返回指向该…

跨域解决方案

同源策略 同源策略是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。 所谓的同源是指【协议域名端口】三者相同,即便两个不同的域名,指向同一个IP地址&#xf…

手把手教你下载darknet_ros

前两天下载darknet_ros,好怪啊,是我太菜了,根本看不懂这都啥啊,所以记录一下 首先附上链接 这里是github上的代码:https://github.com/leggedrobotics/darknet_ros 这里是gitcode上的代码:https://gitcode…

软件技术体系汇总-Spring篇

Spring源码学习总结 版本说明 系列文章是本人在学习 Spring 源码的过程中总结 Spring 版本:5.2.8.RELEASE 调试工具:IDEA2020.3 作者:虎哥 常见面试题 1. 什么是 Spring Framework ? 官方文档: Spring makes it eas…

U-Mail邮件中继完美解决邮件超大附件发送难题

随着企业数字化转型的逐步深入,电子邮件成为了企业内部或与外部业务沟通交流的重要方式之一。但是我们在发送电子邮件的时候,如果邮件中包含工程设计图纸,视频文件、产品设计方案等超大附件,发送的邮件会被对方邮件服务器拒收&…

[架构之路-199] - 可靠性需求与可靠性分析:鱼骨图、故障树分析法FTA、失效模式与影响DFMEA,找到影响故障的主要因素

目录 引言: 第1章 故障树分析法与鱼骨图的比较 1.1 相同点 1.2 区别点 第2章 鱼骨图 第3章 故障树 3.1 示意图 3.2 故障树解读 3.3 故障树常见符号 第4章 产品失效(Failure)模式分析DFMEA 引言: 目标系统/产品的可靠性和性能在客户需求阶段就…

从浏览器输入域名开始分析 DNS 解析过程

摘要:DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于 TCP/IP 网络。 本文分享自华为云社区《DNS 那些事 —— 从浏览器输入域名开始分析 DNS 解析过程》&#x…

基于SSM的大学生就业信息管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…