C++初阶 日期类的实现(下)
目录
一、输入输出(>>,<<)重载的实现
1.1初始版
1.2友元并修改
1.2.1简单介绍下友元
1.2.2修改
1.3>>重载
二、条件判断操作符的实现
2.1==操作符的实现
2.2!=操作符的实现
2.3>操作符的实现
2.4>=,<=,<操作符的实现
三、日期-日期的实现
四、下期预告
前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的
一、输入输出(>>,<<)重载的实现
1.1初始版
我们先来试着重载<<(输出流),它的类型是ostream(output stream),也就是说,如果我们在类里面实现的话,我们只需要传递cout进去,因为有this指针的存在,我们可以少传一个值,然后再通过这个传递过去的cout将日期打印出来就行。
最后思考一下返回值,我们可以从cout<<a<<b<<endl这段语句看出输出流是支持连续传参的,也就是说它是有返回值的,仔细思考可以看出,它们最后都是流向了控制台面板然后输出出来,也就是说它们都流向了cout,所以我们的返回值就应该是cout。最好使用引用返回,和引用传参,因为这个参数对应的cout是个全局变量不会随着你函数作用域的结束而销毁。
第一次实现往往就实现成了这副模样
ostream& operator<<(ostream& out){out << _year << "-" << _month << "-" << _day<<endl;return out;}
逻辑没有问题,也确实可以实现,但是我们在具体使用的时候就会出现这样一个问题,没有与之相匹配的运算符,这是为什么?
原因其实很简单,在我们使用+=运算符时,我们只需要d1+=1;即可,这就等效于d1.operator+=(1);那么我们cout<<d1,就像是将cout作为第一个参数进行传递,这自然是不符合语法的,但这个时候我们只需要d1<<cout,就会等价于d1.operator<<(cout);就可以进行对应的流出。
d1<<cout:
1.2友元并修改
1.2.1简单介绍下友元
如果以后得d1<<cout 那未免有点抽象,我还是更喜欢cout<<d1,这要如何解决呢,我先揭晓答案,在类中实现解决不了这个问题,为什么呢,因为在类中实现一个函数,它的第一个参数注定就是this指针 因此我们只能够尝试在类外面使用两个参数来解决这个问题,但这样的话就会涉及到一个问题,那就是类中private的成员是没法访问的,而直接把private去掉来解决这个问题就多少有点舍本逐末了。
这时候就可以介绍到友元,什么是友元呢,友元就是在类中声明一下需要友元的函数,并在前+friend,这就是友元,之后被友元的函数就可以使用类里面的私人成员,例如说,我有一个int sum(int a, int b)函数,我想要这个sum函数可以访问到我类里面的成员,那么我就可以在类中friend int sum(int a,int b);不过值得注意的一点是,类和类之间的友元,友元是单向的,我把你看作是我的朋友,可你不一定把我当你的朋友 例如你有两个类,一个叫Date,一个叫test,你在Date里面friend class Date 那么在Date中就可以访问到test对象的私有成员,但test不可以访问到Date的私有成员。
1.2.2修改
有了友元之后我们的修改便只需要在类外面把我们的函数写好后,再在Date类中使用友元扩大我们函数的权限即可
1.3>>重载
有了前面的基础,这个的实现自然是手到擒来的
二、条件判断操作符的实现
2.1==操作符的实现
三个参数都相同就相同,即年月日都相等就相等
bool operator==(Date& d1){return (_year == d1._year) && (_month == d1._month) && (_day == d1._day);}
2.2!=操作符的实现
复用一下==操作符即可
bool operator!=(Date& d1){return !((*this) == d1);}
2.3>操作符的实现
先将大于的全都判断完,剩下的就一定是小于或者等于,也就是false,顺着这个思路写
bool operator>(Date& d1){if (_year > d1._year){return true;}if(_year==d1._year&&_month>d1._month){return true;}if (_year == d1._year && _month == d1._month && _day > d1._day){return true;}return false;}
2.4>=,<=,<操作符的实现
这三个操作符均可以通过复用实现,这里就不再赘述。
bool operator>=(Date& d1){return (*this) > d1 || (*this) == d1;}bool operator<(Date& d1){return !((*this) >= d1);}bool operator<=(Date& d1){return !((*this) > d1);}
三、日期-日期的实现
目标:计算出两个日期之间差了多少天
采用的方法是先获得两个日期分别的年份,通过年份的间隔来计算这两个年份之间差了多少天,比方说2023.11.2和2020.10.1,后面的月和日先忽略,只计算2023年和2020年之间差了多少天。
然后创建两个年份对应的初始日期,继续拿上面的例子来说,创建的两个初始日期就是2023.1.1和2020.1.1然后通过++的方式计算出和原日期之间的差值。
最后的结果就是年份之间差的天数+小的年份和对应原日期的差距-大的年份和对应原日期的差距,如果是小的减大的就交换下变量,并将公式换为 -(年份之间差的天数-小的年份和对应原日期的差距+大的年份和对应原日期的差距)这个可以用flaw实现
int operator -(Date d2){int big_year = _year;int small_year = d2._year;int sum = 0; int flaw = 1;if (*this < d2){int tmp = big_year;big_year = small_year;small_year = tmp;flaw = -1;}Date d1_cp(_year,1,1);Date d2_cp(d2._year,1,1);while (small_year != big_year){sum += GetYearDay(small_year);small_year++;}int a1 = 0; int a2 = 0;while (d1_cp != (*this)){d1_cp++;a1++;}while (d2_cp != d2){d2_cp++;a2++;}if(flaw==1)return sum + a1 - a2;elsereturn -(sum-a1+a2);}
测试:
四、下期预告
类和对象就这样讲完了,下回我们来讲一下C++的内存管理QAQ
相关文章:

C++初阶 日期类的实现(下)
目录 一、输入输出(>>,<<)重载的实现 1.1初始版 1.2友元并修改 1.2.1简单介绍下友元 1.2.2修改 1.3>>重载 二、条件判断操作符的实现 2.1操作符的实现 2.2!操作符的实现 2.3>操作符的实现 2.4>,<,<操作符的实现 三、日期-日期的实现 …...

大师学SwiftUI第16章 - UIKit框架集成
其它相关内容请见虚拟现实(VR)/增强现实(AR)&visionOS开发学习笔记 SwiftUI是一套新框架,因此并没有包含我们构建专业应用所需的所有工具。这意味着我们会需要求助于UIKit(移动设备)和AppKit(Mac电脑)等原…...

7.docker运行redis容器
1.准备redis的配置文件 从上一篇运行MySQL容器我们知道,需要给容器挂载数据卷,来持久化数据和配置,相应的redis也不例外。这里我们以redis6.0.8为例来实际说明下。 1.1 查找redis的配置文件redis.conf 下面这个网址有各种版本的配置文件供…...

unity教程
前言 伴随游戏行业的兴起,unity引擎的使用越来越普遍,本文章主要记录博主本人入门unity的相关记录大部分依赖siki学院进行整理。12 一、认识unity引擎? 1、Unity相关信息: Unity的诞生:https://www.jianshu.com/p/550…...
未定义与 ‘double‘ 类型的输入参数相对应的函数 ‘Link‘
报错 检查对函数"Link"得调用中是否缺失参数或参数数据类型不正确。 未定义与"double"类型的输入参数相对应的函数"Link"。 问题描述 网上搜了搜一般说是toolbox没有下载导致的,相当于调用的包本地没有。 但是我看看了 Robotics…...

为什么Transformer模型中使用Layer Normalization(Layer Norm)而不是Batch Normalization(BN)
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...

Vite - 配置 - 文件路径别名的配置
为什么要配置别名 别名的配置,主要作用是为了缩短代码中的导入路径。例如有如下的项目目录: project-name| -- src| -- a| --b| --c| --d| --e| -- abc.png| -- index.html| -- main.js如果想在 main.js 文件中使用 abc.png ,则使用的路径是 ࿱…...

phpStorm Xdebug调试 加FireFox浏览器
步骤1: [Xdebug] zend_extension“D:\phpstudy_pro\Extensions\php\php5.4.45nts\ext\php_xdebug.dll” xdebug.collect_params1 xdebug.collect_return1 xdebug.remote_enableOn xdebug.remote_hostlocalhost xdebug.remote_port9001 xdebug.remote_handlerdbgp ;…...

多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测
多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 …...

linux配置固定ip(两种方法)
首先刚下载的vm,刚创建的虚拟机,肯定是需要配置ip的 其次以前我的每次都是设置自动ip,这样每次登录都会自动获取ip地址,并且每次的ip都不相同。 ~方法: 开机登陆后 1)Cd /etc/sysconfig/network-scripts 2)Vi ifcf…...

什么是缓存雪崩、击穿、穿透?
背景 数据一般是存储于数据库中,数据库中的数据都是存在磁盘上的,磁盘读写的速度相较于内存或者CPU中的寄存器来说是非常慢的了。 如果用户的请求都直接访问数据库的话,请求数量一上来,数据库很容易就崩溃了,所以为了…...

可以通过电脑远程控制安卓设备的软件
有些时候,我们需要用电脑远程控制安卓设备,比如远程维护门店设备、安卓系统的户外广告牌等等。我们来探索和比较几款允许用户通过电脑远程控制安卓设备的软件。 1、Splashtop Business Splashtop 是一种多功能远程访问解决方案,以其高性能流…...

HP惠普暗影精灵9笔记本电脑OMEN by HP Transcend 16英寸游戏本16-u0000原厂Windows11系统
惠普暗影9恢复出厂开箱状态,原装出厂Win11-22H2系统ISO镜像 下载链接:https://pan.baidu.com/s/17ftbBHEMFSEOw22tnYvPog?pwd91p1 提取码:91p1 适用型号:16-u0006TX、16-u0007TX、16-u0008TX、16-u0009TX、16-u0017TX 原厂系…...
vue2+elementUI 仿照SPC开发CPK分析工具
源码地址请访问 Vue CPK分析工具页面设计源码(支持左右可拖拽和表格可编辑、复制粘贴)仿照SPC开发-CSDN博客...

云ES使用集群限流插件(aliyun-qos)
aliyun-qos插件是阿里云Elasticsearch团队自研的插件,能够提高集群的稳定性。该插件能够实现集群级别的读写限流,在关键时刻对指定索引降级,将流量控制在合适范围内。例如当上游业务无法进行流量控制时,尤其对于读请求业务,可根据aliyun-qos插件设置的规则,按照业务的优先…...

2023.11.17 hadoop之HDFS进阶
目录 HDFS的机制 元数据简介 元数据存储流程:namenode 生成了多个edits文件和一个fsimage文件 edits和fsimage文件 SecondaryNameNode辅助NameNode的方式: HDFS的存储原理 写入数据原理: 发送写入请求,获取主节点同意,开始写入,写入完成 读取数据原理:发送读取请求,获取…...

如何在el-tree懒加载并且包含下级的情况下进行数据回显-01
在项目中做需求,遇到一个比较棘手的问题,el-tree懒加载在包含下级的时候,需要做回显,将选中的数据再次勾选上,在处理这个需求的时候有两点是比较困难的: el-tree是懒加载的,包含下级需要一层一…...

系列六、JVM的内存结构【栈】
一、产生背景 由于跨平台性的设计,Java的指令都是根据栈来设计的,不同平台的CPU架构不同,所以不能设计为基于寄存器的。 二、概述 栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,线程销毁时销毁&…...

技巧篇:在Pycharm中配置集成Git
一、在Pycharm中配置集成Git 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可: https://git-for-windows.github.io/ 0. git中的一些常用词释义 Repository name: 仓库名称 Description(可选):…...

Yolov5
Yolov5 Anchor 1.Anchor是啥? anchor字面意思是锚,是个把船固定的东东(上图),anchor在计算机视觉中有锚点或锚框,目标检测中常出现的anchor box是锚框,表示固定的参考框…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...