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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows下安装RabbitMQ

1.安装Erlang 因为RabbitMQ是用Erlang语言编写的&#xff0c;所以在安装RabbitMQ之前需要先安装Erlang。 如果还未安装Erlang&#xff0c;官方下载安装包&#xff0c;点击Download Windows installer下载Erlang Downloads - Erlang/OTP 下载Erlang/OTP后&#xff0c;双击otp的…

【入门篇】1.5 redis 客户端Jedis和Lettuce对比详解

文章目录 0. 前言1. Lettuce 与Jedis 对比2.详解2.1 线程安全2.2 阻塞/非阻塞2.3 集群支持2.4 PUB/SUB模型2.5 二进制协议 3. 参考资料 0. 前言 对于Java开发者来说&#xff0c;Jedis和Lettuce是两种非常常见的Redis客户端&#xff0c;他们可以帮助开发者更容易地在Java应用中…

提升 Python 执行速度:Codon、C/C++、Rust、Numba(JIT)、Taichi、Nuitka、MatxScript

几种流行的 Python 性能加速方案对比&#xff1a;https://zhuanlan.zhihu.com/p/604519817 对于一般通用场景用户&#xff0c;对性能没有那么强烈的诉求&#xff0c;紧跟官方步伐&#xff0c;升级到最新版本的 Python 既可&#xff0c;或者使用 PyPy。Numba、Codon、Taichi 等这…

网工内推 | Linux运维,六险二金,最高30K,IE认证优先

01 上海域起 招聘岗位&#xff1a;Linux运维工程师 职责描述&#xff1a; 1.负责游戏产品运维相关的工作&#xff0c;流程文档、技术文档、功能脚本的编写整理 2.负责分析并排除系统、数据库、网络、应用等游戏产品运维中出现的故障及错误 3.负责对游戏产品项目进行线上部署、…

kubenetes-pod高可用

一、概述 实现pod层面的高可用&#xff0c;需要避免容器进程被终止避免Pod被驱逐&#xff1a; 设置合理的resources.memory limits 防止容器进程被 OOMKill&#xff0c;防止Pod被驱逐&#xff1b;设置合理的emptydir.sizeLimit 并且确保数据写入不超过emptyDir的限制&#xf…

kubenetes-容器网络接口CNI

一、CNI Kubernetes 网络模型设计的基础原则是&#xff1a; 所有的Pod能够不通过NAT(网络地址转换)就能相互访问。所有的节点能够不通过NAT就能相互访问。容器内看见的IP地址和外部组件看到的容器IP是一样的。 Kubernetes的集群里&#xff0c;IP地址是以Pod为单位进行分配的…

强化学习在文生图中的应用:Training Diffusion Models with Reinforcement Learning

论文链接:Training Diffusion Models with Reinforcement Learning项目地址:Training Diffusion Models with Reinforcement Learning官方代码:https://github.com/kvablack/ddpo-pytorch/tree/maintrl实现:https://huggingface.co/docs/trl/ddpo_trainer🤗关注公众号 fu…

【Linux系统化学习】进程的父子关系 | fork 进程

个人主页点击直达&#xff1a;小白不是程序媛 Linux专栏&#xff1a;Linux系统化学习 目录 前言&#xff1a; 父子进程 父子进程的引入 查看父子进程 查询进程的动态目录 更改进程的工作目录 fork创建进程 fork的引入 fork的使用 fork的原理 fork如何实现的&#…

git diff相关命令

git diff相关命令 git diff git diff此命令比较的是工作目录中当前文件和暂存区中的文件差异&#xff0c;也就是修改之后还没有暂存起来的变化内容。因为后续要将工作目录中的文件添加到暂存区。 示例&#xff1a; 当前工作目录下有一个2.txt的文件&#xff0c;文件的内容是…

JVM虚拟机:CMS垃圾回收器的日志分析

本文重点 本文我们将学习CMS垃圾回收器的日志 使用CMS java -Xms20M -Xmx20M -XX:PrintGCDetails -XX:UseConcMarkSweepGC 类名 日志格式 分析 上面的日志我们分为了两部分&#xff0c;上面表示新生代&#xff0c;下面表示老年代。 ParNew表示年轻代收集器&#xff0c;6144…

【使用vscode在线web搭建开发环境--code-server搭建】

官方版本下载 https://github.com/coder/code-server/releases?q4.0.0&expandedtrue使用大于版本3.8.0,因为旧版本有插件市场不能访问的情况版本太高需要更新环境依赖 拉取安装包 []# wget "https://github.com/coder/code-server/releases/download/v4.0.0/code-…

Python uiautomation获取微信内容!聊天记录、聊天列表、全都可获取

Python uiautomation 是一个用于自动化 GUI 测试和操作的库&#xff0c;它可以模拟用户操作来执行各种任务。 通过这个库&#xff0c;可以使用Python脚本模拟人工点击&#xff0c;人工操作界面。本文使用 Python uiautomation 进行微信电脑版的操作。 以下是本次实验的版本号。…