C++——类和对象(3)

news2024/11/22 9:07:57

作者:几冬雪来

时间:2023年5月6日

内容:C++类和对象内容讲解

目录

前言: 

1.运算符重载(续): 

2.赋值重载:

结尾: 


前言: 

在上一篇博客中我们再一次讲解了类和对象的内容,并且引入了一个新的重载模式——运算符重载,那么今天我们就接着对其进行说明。 

1.运算符重载(续): 

在上一篇博客中我们讲解了一个日期类运算符重载的实现,也得知了运算符重载的话,如果是内置类型的话我们可以不进行书写,如果是自定义类型的话,我们就要对其进行书写。

我们也进行了日期的比较。 

但是并不是所以运算符都是有意义的。 

还是以我们的日期类函数为例:

比如:日期减日期可以算出我们两个日期间隔的天数,它是有意义的;但是在这里日期加日期就是没有意义的行为了。 

而是否要重载运算符,取决于这个这个运算符对类有无意义

 

类似我们这个代码,这两种写法从底层来讲是一样的。

因此在编译器来看,我们的第一个代码等价与第二个代码,在过程中我们的第一个代码就转换为第二个代码的指令。 

但是这个代码是在类的外面的,因此我们无法去访问私有和保护

在这里我们有两种方案,一种是友元这是我们后面才需要学习的知识,另一种方法则是将其放进类中。 

但是在这里我们将代码放入类中的时候,代码报错了,这是因为在运算符重载的时候我们C++中有所规定

在类中,作为类成员函数重载的时候,其形参看起来比操作数数目少1,因为在类中成员函数的第一个参数为隐藏的this

且必须有一个参数为类类型,也就是自定义类型

 

像这种两个都是内置类型的就会发生报错,因此至少要有一个自定义类型的。 

操作符有几个操作数,重载就有几个参数

因此我们的代码要进行修改。

而在我们学到现在的所有的运算符中,有五个运算符不能进行重载操作。 

这个知识点一般会出现在选择题当中。 

2.赋值重载:

接下来我们来讲解赋值重载。

首先在这里我们就要区分一下这两种情况,一种是两个对象都存在,一种是对另一个对象进行初始化的操作

在这里我们也可以轻而易举的写出我们的代码,但是像这种代码的话有一个不足的点

在我们的编译器中,我们可以在C语言和C++中写出这种赋值的代码。

这里的赋值顺序是从右到左进行赋值。 

但是在我们上面的赋值重载中,因为我们并没有返回值为void

因此在进行了第一次重载之后,我们就没有办法顺利的进行第二次重载了。

因此我们的代码要修改成这个样子,返回的是this指针,又因为节省空间因此在这里我们还要对其进行引用的操作

这样我们就是返回的就是d4的一个别名了,同时也不用担心出作用域销毁的事情。 

因为我们的赋值重载和拷贝构造一样,所以我们可以让编译器自己帮我们创建。

如果是栈的话,就需要我们自己去创建。 

这里还要了解的一个点是:

赋值运算符只能重载类型成员不能重载全局函数

默认成员函数不能写到全局。

同时我们的声明和定义也可以进行分离

这里就是我们的日期类小于形的代码的声明和定义的分离

但是我们的日期类可用的操作符远不止小于这一个操作符。

类似大于,减号,等于等操作符都可以用在日期类中

我们这里可以像上面的代码一样各自书写一个大于,等于的代码出来。但是这样做的话就增加了代码的数量,减少了可读性。在这里我们还有什么其他的方法吗?

像这里我们先写一个==类型的重载,然后下来的代码就进行一个另一种方法的书写,如我们上面的代码一样

这样就能简单的写出我们日期类的各种比较。

同时日期加天数和日期减日期也可以通过这种方式来完成

要执行上面操作的话,我们首先就要算出每个月的天数

这个操作我们写过很多次,这里就不再重复了。 

再下来我们就只需要书写它的代码即可。

在这里我们如果使用的是引用的话,最后会提防因为销毁的原因出现问题,因此在这里我们采用的是这一种写法。 

构造函数也是为了防止其销毁。 

而且我们也可以由我们的+来引入+=的代码。 

像上面左右的代码都是正确的,不过二者相对比左边的代码要更优一点。 

这是因为左边的代码只需要创建两个对象,而右边的这种却要四个,+=的有一些亏

同时我们的日期类还是其他的操作符可以对其使用。

类似我们的日期可以进行++操作

只不过我们的++是单运算符。 

但是众所周知在C语言中我们的++操作符分为了前置和后置

因此在这里我们的代码到底是调用的哪一个?

用我们以前的知识来讲解。

前置++是返回++后的值,后置++是返回++前的值

虽然它们的内部都要进行++操作,所以不能用同一个运算符重载替代

为此,我们为后置++中的参数提供了int。

增加这个int并不是为了接收具体的值,这仅仅是为了占位,根前置++构成重载

因为后置++需要进行创建对象,我们就将其牺牲掉了。

同时,前置++和后置++,在底层所代表的也不相同

在这里我们可以看见,后置++我们的括号能没有任何东西,而前置++中则有加入一个随机的数来对其进行一个区分。 

结尾: 

到这里我们的又增加了对类和对象的了解,并且这几篇博客的内容都有关联,如果在哪里没有学好的话,可能会导致后序课程的乏力,因此有空的时候要对其进行复习。最后希望这篇博客能有所帮助。

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

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

相关文章

【Python入门】Python的判断语句(布尔类型和比较运算符)

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

JavaScript:二叉树(层序遍历)

二叉树的层序遍历 层序遍历:逐层地,从左到右访问所有节点 广度优先 文章目录 二叉树的层序遍历102. 二叉树的层序遍历 - 力扣(LeetCode)107. 二叉树的层序遍历 II - 力扣(LeetCode)199. 二叉树的右视图 - 力…

Center-based 3D Object Detection and Tracking 论文学习

论文地址:Center-based 3D Object Detection and Tracking Github 地址:Center-based 3D Object Detection and Tracking 1. 解决了什么问题? 在点云中,3D 目标通常以 3D 框的形式表示。这个表征借鉴于 2D 图像的检测&#xff0…

nvm管理node版本与node对应的npm的版本

五一长假回来打开电脑发现自己的vscode不能成功运行项目,npm run dev之后没有任何反应,于是我想着使用cmd打开试试,结果cmd打开后画面只有一个横着的光标再闪,停几秒后就自动关闭了,看其他的博主写的解决方法一一试过了…

错排问题之年会抽奖与抄送列表

目录 一、编程题 1.年会抽奖 2.抄送列表 二、选择题 1.操作系统中关于竞争和死锁的关系下面描述正确的是? 2.并发是并行的不同表述,其原理相同。 3.在Unix系统中,处于()状态的进程最容易被执行。 4.当系统发生抖动(thrashi…

git版本升级后的问题

升级后的版本 git version 2.40.1.windows.1问题 RSA公钥和私钥是否有问题(本地和gitlab)[Git for Windows]的升级日志 Git for Windows 2.36.1 Git for Windows 2.33.0(2) 查看OpenSSH版本信息 OpenSSH v8.7p1 OpenSSH v8.8p1 解决方案 在本机~/.ss…

轨交展:人大金仓护航“中国式现代化的开路先锋”

2023北京-青岛国际城市轨道交通展览会 以“智赋城轨、绿色发展”为主题,2023北京-青岛国际城市轨道交通展览会暨高峰论坛于4月27日-29日在青岛举办,人大金仓携自主创新技术成果以及系列行业解决方案亮相,受到用户、伙伴的广泛关注和高度认可。…

GaussDB数据库基础函数介绍-下

接上一篇,本节继续介绍GaussDB数据库常用基础函数 目录 5、范围函数 6、窗口函数 7、聚集函数 8、安全函数 9、系统信息函数 10、动态脱敏函数 GaussDB常用基础函数介绍与示例 5、范围函数 在GaussDB数据库中,范围函数是指用于处理数据库范围的函…

Linux — 线程池及多线程结尾

目录 一、线程池 线程池的应用场景: 线程池示例: 二、线程安全的单例模式 什么是单例模式 什么是设计模式 单例模式的特点 饿汉实现方式和懒汉实现方式 三、STL,智能指针和线程安全 四、其他常见的各种锁 五、读者写者问题(了解) 读写锁 读写…

搭建Stable Diffusion WebUI详细过程

文章目录 1、环境搭建1.1、GPU服务器选择1.2、配置服务器环境 2、源码和模型下载3、安装依赖库文件4、运行项目5、视频教程 1、环境搭建 为了方便,这里直接选择Vultr提供的已安装Anaconda的Ubuntu 22.04系统。 如果你自己电脑有足够的显存,你也可以在自…

Nacos Config 配置帐号密码加密后,注入过程中如何解密?

背景 线上项目规定不能在配置文件中出现帐号、密码的明文信息,所以必须加密。 引入 Nacos Config 配置后,Nacos Config 帐号密码、加密,服务注册发现也用相同的 nacos 帐号密码,那么如何解密才能保证 Nacos Config 服务能够正确…

【C语言】typedef关键字

文章目录 一. 使用介绍1. 对一般类型进行重命名2. 对结构体类型进行重命名3. 对指针进行重命名4. 对数组进行重命名 二. typedef 和 #define 的区别 一. 使用介绍 typedef 的作用就是对类型进行重命名,具体作用在以下几个方面: 对一般类型进行重命名对…

IP协议的相关特性

IP协议的相关特性 🔎地址管理动态分配NATIPv6 🔎IP 地址的组成网络主机号的划分IP 地址分类(A, B, C, D, E)子网掩码特殊的 IP 地址 🔎路由选择 图片来自网络 🔎地址管理 IP地址, 本质上是一个32位的整数 通常会把32位的整数, 转…

基于ChatGLM-Med与HuaTuo的微调部署

文章目录 ChatGLM-Med推理过程微调过程 HuaTuo配置环境模型下载推理过程微调过程 如何基于领域知识对类ChatGPT模型进行微调,以提升类ChatGPT模型在领域的问答效果? 有下面两个模型,一起来看看微调后的效果如何。 ChatGLM-Med: 基于中文医学知…

2023亚马逊云科技研究,数字化技能为中国企业和员工带来经济效益

在中国,信息技术在个人、企业和宏观经济层面都推动着重大变革。为了研究这些变化所带来的影响,盖洛普咨询公司(Gallup)和亚马逊云科技开展了关于数字化技能的调研。 研究表明,数字化技能正在为中国企业和在职人员带来巨大的经济价值&#x…

【Python】贪吃蛇 —— 无聊必备的小项目

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,YOLO领域博主爱笑的男孩。擅长深度学习,活动,YOLO,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect个人…

【python】keras包:深度学习( RNN循环神经网络 Recurrent Neural Networks)

RNN循环神经网络 应用: 物体移动位置预测、股价预测、序列文本生成、语言翻译、从语句中自动识别人名、 问题总结 这类问题,都需要通过历史数据,对未来数据进行预判 序列模型 两大特点 输入(输出)元素具有顺序关系…

透过金瑞基金一季度运营报告,看满帮创新故事背后的长期价值

投资中国市场该投哪些行业、哪些公司?在投资界,KraneShares金瑞基金长期致力于为这个问题提供答案。中概投资者都十分熟悉的KWEB——中概互联网指数ETF,就来自金瑞基金。 近日,金瑞基金发布了2023年第一季度运营报告,…

入门款但配置高 极米投影仪Z6X Pro轻松打造家庭影院

近年来,智能投影仪凭借大屏沉浸式体验以及使用场景灵活多变的便利性深受消费者欢迎。现如今,智能投影仪既能替代电视的职能,也能灵活融入小居室、出租屋等生活场景,顺理成章成为年轻人的“潮品”。京东电器2022年发布的《年轻人潮…

BetaFlight统一硬件配置文件研读之dma命令

BetaFlight统一硬件配置文件研读之dma命令 1. 源由2. 代码分析2.1 cliDma2.2 showDma2.3 cliDmaopt 3. 实例分析4. 配置情况4.1 dma4.2 dma show4.3 dma device list4.4 dma pin list4.5 dma device id4.5.1 dma adc id4.5.2 dma TIMUP id4.5.3 dma pin id 4.6 dma device id s…