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

news2024/12/23 9:17:30

作者:几冬雪来

时间:2023年5月8日

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

目录

前言:

1.操作符重载(续):

前置++和后置++: 

日期减日期: 

<<操作符: 

结尾: 


前言:

在上一篇博客中,我们借助了日期类的代码实现了赋值重载等操作,今天我们就对其进行进一步的讲解。

1.操作符重载(续):

在上一篇博客中我们大致的讲解了操作符重载,并且书写了日期类的日期加天数的代码。而接下来我们就来实现日期类代码的其他形式。

在我们的日期类代码中,乘和除基本没有意义

并且日期加日期也没有意义

而我们的日期减天数和日期减日期就有意义,接下来我们就来写日期减天数的代码。 

这里我们就可以先写出-=的代码,再对其进行附用来书写出我们日期减天数的代码。 

  

在这里我们也可以成功的实现日期减天数的代码。 

但是实际上在我们的日期类中还有许多离谱的操作

就类似我们的上面的这段代码,我们实现的是一个日期减天数的操作。

如果在这里我们这里减等于的日期是一个负的天数会怎么样

这里我们的日期减等于一个负的天数,在我们看来就是加上这个天数。

因此在这里我们就需要对减等于处的代码进行修改

说是修改其实也就是追加一个设定。 

减等于处的开头进行判断,如果在这里我们的day小于0的话

这个时候我们就要去附用加等于的操作了,并且在附用之前我们需要将day的符号由负号转正

同样的情况,在加等于处如果加等于一个负数的话,在这里就要附用减等于的代码。 

前置++和后置++: 

接下来我们就来延续上一篇博客最后讲解到的++操作。

在编译器中我们分为前置++和后置++

而这里,如果是内置类型的前置++和后置++并没有对我们的代码有什么过大的影响

但是在自定义类型中我们就需要去注意前置++和后置++所带来的不同。 

如果是我们需要一个值来接收我们返回值的话

在底层处它们的写法也会发生一定的变化。 

但是,这里有一个要科普的知识点。

因为分辨前置和后置++,在内置类型影响较小,在自定义类型影响较大

我们在声明的时候不能用同一个函数对其声明

在有些语言中,因为过于麻烦的原因它们可能会将++操作符pass掉,只留下+=操作符

日期减日期: 

接下来我们就来书写日期减日期的代码。

日期减日期,最后减出来的是两个日期的天数差

但是在这里,日期减日期的代码并不是那么好写的。

因为平年和闰年二月份的差异,我们的代码不能直接进行相减。 

因此我们不采取这种方式,而是对前面的代码进行附用的操作。 

这里我们采取的另一种方法就要用小的日期加至大的日期

这里就是两个日期中相差的天数。 

这里要注意的是,在开始的时候我们因为是需要小日期加到大日期,所以我们要先进行判断

判断是否要对其进行交换的操作。

接下来就是两个日期间进行比较,并且定义一个n来表示相差的天数,在最后我们返回的日期天数还要乘我们的flag

因为在这里,我们小日期减大日期减出来的是一个负数

虽然在代码中我们使用的是大日期减去小日期,然后再让小日期加到大日期

但是实际上,外面并没有进行交换的操作,我们的小日期减去大日期是负数,因此在最后我们要乘以flag,将其进行改变。 

从我们上面的结果来看我们也是成功的实现了操作。

<<操作符: 

在这里我们实现了上面的一系列的操作。

但是在这里如果要打印出我们的结果的话,是这个样子调用的。

那么这个地方我们能不能实现,打印结果的分开声明和定义

那当然是可以的。 

像我们的代码要从左边的形式装换为右边这种形式

这样做可以一定程度的增强代码的可读性

在这里要实现这种转换的话,我们要在头文件中先进行声明。 

但是右边写法的声明相比较与我们前面那些代码的声明方式略有不同。 

在这里我们的声明和定义要写成这种形式。 

这里涉及我们一部分类和对象后面板块的知识,现在我们就先看一下。 

但是这样写的话,我们就能成功的打印出我们的结果吗?

并没有,这里会发生报错。  

这是因为:

而要解决这个问题也是十分的方便。

就是在一开始的地方将我们的d6和cout互换位置。 

交换了之后就可以顺利的打印出我们的结果

可这样写虽然代码也可以跑起来,却不符合我们的书写习惯

因为在C++中我们通常都默认cout是写在最右边处的

并且在这里我们也不可能通过修改使其变成cout写在最左边的形式,这是库里面所规定的。 

这里要让cout在左边有两种书写方式。 

这里的第一种方法就是写在我们的公有区域

但是众所周知,如果写在公有区域要去调用类中的内容就要注意私有和维护的问题

解决它的方法也是有的。 

这里就是在我们的类中进行GetYear,GetMonth等操作,最后再写到我们的定义中去,这里就可以通过这种方式解决

第二种方法则是友元函数

使用友元函数声明也可以解决我们这个问题

友元函数等我们以后再来讲解。

那么这里还有一个问题,类似我们下面的这种多段流插入的代码。 

因为是多段的流插入,使用在这里就应该要有我们的返回值

我们的代码就要进行修改。 

当然在这里既然有我们的流操作的操作符,那么肯定要有我们的流提取的操作符

而我们的流提取的操作符则可以通过我们流操作的代码修改而来。 

这里要注意的是,我们的流插入中d的内容不用修改,所以我们加入const

但是在流提取中我们两个参数都不能用const固定,它们都是要改变的。 

在书写完了上面的这一系列的代码,接下来我们就来慢慢的解决一些小问题。 

像上面我们在流插入处输入一个不合理的日期,但是我们的编译器还是将其打印出来了

因此我们还要对其进行一个判断的操作。 

既然在流插入会出现这个问题,那么在流提取处我们也要对其进行判断

注意在这里我们的GetMonthDay要改为静态的

接下来讲解我们的最后的一个问题

比如在我们打印的时候。

在打印的时候我们去调用了类中的Print,但是从结果上来看我们的第一个日期可以进行调用打印,但是我们的第二个日期却不能。 

这里的这个问题就要回到我们以前的有关权限的问题。 

接下来我们就来分析一下。 

在这里传递的时候就会出现问题。

第一个代码我们传递的内容是Data*,但是第二段代码不是Data*而是const Data*,在接收的地方为Data*

这样子就导致了我们的第一个代码为权限的平移,编译器是允许的,但是第二段代码则是权限的放大,代码会报错。那么我们如何去解决这个问题?

这里的解决方法十分的简单,就是在接收处将我们的Data* this修改为const Data* this。 

在这里我们的第一段代码就会变为权限的缩小,而且第二段代码会变为权限的平移

而在编译器中权限的缩小和平移的操作都是被允许的。 

那么怎么对其进行修改就是一个问题,因为在代码中我们的this指针是隐含的不能显示着写,我们无法直接对其进行修改,那么该在哪里加入我们的const呢? 

这个地方我们只能将const加在我们代码的后面,用来修饰我们的*this

这也是没有办法只能这样写。 

普通函数后面加上const以后,普通和const对象都可以调用

但是并不是所有成员函数都要加const,要修改的对象成员变量的函数不能加入const。 

这里我们就可以得出一个结论:

只要成员函数内部不修改成员变量,例如:比较大小,+等不用改变自身就应该加上const,这样const对象和普通对象都可以调用。类似:+=,-=等操作符要改变自身的就不能加上const。

结尾: 

到这里我们类和对象(中)的知识就要学习完毕了,再过不就我们的类和对象的内容就要完结了,完结了类和对象后,我们的C++的第一个大板块就要结束了。这几篇C++的难度相比之前有所提高,我们要多去消化它。最后希望这篇博客能给大家带来帮助。 

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

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

相关文章

智能里既有技术也有艺术

智能不仅仅是技术方面的创新和应用&#xff0c;也是一种艺术的体现。智能技术需要融合多个学科和领域的知识&#xff0c;包括计算机科学、数学、心理学、哲学、人文艺术、宗教民俗等等&#xff0c;从而形成一个完整的系统。这个系统的设计和实现&#xff0c;需要技术人员具备深…

跟着我学 AI丨“Hey,Siri”的前生今世

Siri 是由苹果公司开发的一款智能语音助手&#xff0c;它可以通过语音识别和自然语言处理来回答用户的问题、执行任务、提供建议等等。Siri 可以在 iOS 和 macOS 设备上使用&#xff0c;它的出现极大地改变了人机交互的方式&#xff0c;让我们用语音成为了交互的媒介。 Siri 的…

轻松客观认识大模型系列:一

这是我关于《轻松客观认识大模型系列》第一篇 一、前言 这篇文章旨在为没有计算机科学背景的读者提供一些关于ChatGPT及其类似的人工智能系统&#xff08;如GPT-3、GPT-4、Bing Chat、Bard等&#xff09;如何工作的原理。ChatGPT是一种聊天机器人&#xff0c;建立在一个大型语…

AI 自动补全的这句日志能正常打印吗?

最近用上了 GitHub Copilot&#xff0c;它的能力不时让我惊叹&#xff0c;于是越来越多地面向 tab 编程&#xff0c;机械键盘的损耗都小了许多:-p 这天&#xff0c;它给我自动生成了一句像这样的日志打印代码&#xff1a; try {// ... } catch (Exception e) {log.error("…

Vue列表过滤与数据原理

目录 列表过滤 使用计算属性 使用watch监视属性 列表排序 Vue中数据原理 练习数据原理 Vue中数据原理总结 列表过滤 可以进行模糊搜索 使用计算属性 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml"> <…

YARN框架概述

Yarn 概述 Yarn概述对Yarn的需求简介变迁YARN于MRv1的区别MRv1YARN介绍 YARN集群安装部署集群角色介绍ResourceManager(RM)NodeManager(NM)集群部署规划 YARN RM重启机制概述**开启重启机制**RM状态数据的存储介质开启 后续正在学习&#xff1a;YARN HA高可用 YARN架构体系官方…

DNDC模型

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

harbor(docker仓库)仓库部署

harbor仓库部署 1. harbor概述2. harbor主要功能3. harbor架构介绍4. Docker Compose4.1 compose简介4.2 docker-compose工具命令 5. harbor部署5.1 部署Docker Compose5.2 部署harbor5.3 部署harbor开机自启 6. harbor应用6.1 配置客户端访问harbor6.2 harbor的web管理界面 1.…

炸裂!Hugging Face 发布重磅更新,人手一个 AutoGPT!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; Hugging Face&#xff0c;作为 AI 开源圈最为知名的「网红」创业公司&#xff0c;成立仅几年&#xff0c;便在 GitHub 开源了诸多实用开源项目&#xff0c;受到了不少开发者的赞赏。 其中影…

中小学智慧校园平台电子班牌系统源码的应用

智慧校园云平台电子班牌系统源码 智慧班牌系统是专门为学校打造的智能信息展示平台&#xff0c;为学校、教师、学生、家长创造一个学习成长交流的共享平台。主要用于显示班级信息、 班级风采、校园文化、课程表、校园活动通知、家校互联等。以图片、音视频、文字、动画、文档等…

【ADS867x】14 位 500kSPS 4/8 通道 ADC 简介及驱动应用示例

器件特性 具有集成模拟前端的 14 位模数转换器 (ADC)具有自动和手动扫描功能的 4 通道、8 通道多路复用器通道独立可编程输入&#xff1a; 10.24V、5.12V、2.56V、1.28V、0.64V10.24V、5.12V、2.56V、1.28V 5V 模拟电源&#xff1a;1.65V 到 5V I/O 电源恒定的阻性输入阻抗&am…

Android 14 快速适配要点

随着 Google I/O 2023 发布的 Android beta2 &#xff0c;预计 Android 14 将在2023年第三季度发布&#xff0c;目前看整体需要适配的内容已经趋向稳定&#xff0c;那就根据官方文档简单做个适配要点总结吧。 如何做到最优雅的版本适配&#xff1f;那就是尽可能提高 minitSdkVe…

详细版易学版TypeScript - 类型声明:字符串数字null布尔undefined数组any对象void类型推断联合类型

根据官方 TypeScript 的注意事项&#xff0c;建议不要使用 Number、String、Boolean、Symbol 或 Object。 ts各类型声明的代码如下&#xff1a; 一、字符串类型 let str: string hello; str ts; 二、数字类型 let num: number 123; num 456; 三、布尔类型 let flag: boolea…

C语言实现队列--数据结构

&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️ &#x1f4a5;个人主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王&#x1f525;&#x1f525;&#x1f525; &#x1f4a5;代码仓库&#xff1a;&#x1f525;&#x1f525;魔…

No.065<软考>《(高项)备考大全》【专项3】《论文》

《论文》 1 论文部分相关1.1 考试相关1.2 考试核心相关1.3 历年考试分析1.4 复习建议1.5 评分标准1.5.1 评分的几个方面1.5.2 不及格的几种类型1.5.3 扣分项1.5.4 加分项 1.6 时间进度安排1.7 如何准备 2 必背核心知识 - 10大领域47个过程3 论文写作技巧3.1 论文架构3.2 论文题…

SpringBoot——引导类的简单介绍

简单介绍&#xff1a; 之前我们就说到过引导类&#xff0c;之不过当时就是简单的说了一下这个名字&#xff0c;让大家记住我们运行的程序的学名叫做引导类&#xff0c;但是我们并没有进入看过&#xff0c;介绍过它的作用&#xff0c;这次我们就来简单的介绍一下这个类的作用。…

[NLP] SentenceTransformers使用介绍

SentenceTransformers 是一个可以用于句子、文本和图像嵌入的Python库。 可以为 100 多种语言计算文本的嵌入并且可以轻松地将它们用于语义文本相似性、语义搜索和同义词挖掘等常见任务。 该框架基于 PyTorch 和 Transformers&#xff0c;并提供了大量针对各种任务的预训练模型…

STEP7-MicroWin SMART中修改变量注释的具体方法(绝对寻址+符号寻址)

STEP7-MicroWin SMART中修改变量注释的具体方法(绝对寻址+符号寻址) 如下图所示,我们可以在符号表中定义变量的符号名称以及注释信息, 使用时需注意以下事项: 1.在 STEP 7-Micro/WIN SMART 软件中,可以建立多个符号表,但不允许将相同的符号名多次用作全局符号赋值,在单…

1707_Python中的多成员处理

全部学习汇总&#xff1a; GreyZhang/python_basic: My learning notes about python. (github.com) 欢迎路过的YUAN类朋友们&#xff0c;希望我们能够相互交流共同成长。如有错误或者不足希望及时指点指出&#xff0c;不胜感激&#xff01;以下是我的联系方式&#xff1a; E…

Kali-linux识别活跃的主机

尝试渗透测试之前&#xff0c;必须先识别在这个目标网络内活跃的主机。在一个目标网络内&#xff0c;最简单的方法将是执行ping命令。当然&#xff0c;它可能被一个主机拒绝&#xff0c;也可能被接收。本节将介绍使用Nmap工具识别活跃的主机。 网络映射器工具Nmap Nmap是一个…