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是锚框,表示固定的参考框…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
