日期类的实现和取地址运算符重载

news2025/2/27 8:10:48

       前面将类学的差不多,接下来我们就来实现一下日期类。这个日期类包含运算符重载和前面学

的C++的语法知识。

      首先我们先建立一个日期类的头文件和源文件:

 一.日期类的头文件实现:

        首先我们要知道我们有闰年,还有每个月的天数也不一样,所有这里在写类时,就要注意哪

些年是闰年,哪些月有31天,哪些月是30天。

首先类中有三个私有的成员变量,年,月,日。

接下来就完成判断,哪些月的天数是30天和31天,再去判断哪些年是闰年,这样就导致2月是29

天。

所以这里我们就在类里去写一个函数,用来获取每个月的天数。

这里的Getmonthday函数,我们需要一个静态的数组来存贮每个月的天数,因为我们将这个数组

放到静态区去,这样频繁调用的话就不会再去创造空间,就直接可以用了。

为什么创建13个数组成员,因为数组开始为0,而没有0月,所以就用-1这个值来填这个位置,当

后面就是你是几月,就直接返回那个月的天数。

接下来就算判断是否为闰年还有2月了,如果是就返回29天。

这样整个的获取月的天数的函数就写好了。

写完这个就要将打印日期的声明和拷贝构造函数的声明也写到头文件中去,这样做到声明和定义

分离。

这样头文件的基本盘就写完了。

为什么其他函数的声明和定义是分开的呢,而Getmonthday不是呢,因为Getmonthday在后面会

使用的很频繁,这样不分开就算默认是内敛函数了

二.日期类运算符+的重载:

对于日期类的加,我们如果直接加的话就特别麻烦,你要知道这个月有多少天,每次都去进1,然

然后再去找当前这个月有多少天,所以就导致整个非常混乱并且不好实现。

                             

我们利用这个逻辑,比如我们要加的天数,我们直接加上去,然后我们再判断如果加完的天数,如

果大于本月的天数那么我们就进入一个循环,先用加完的天数减去本月的天数,然后月加一,如果

还是比加完月的月的天数大,就继续走上述循环,如果比其小了,就可以结束循环了。如果一开始

就没有超过那就更好了。

有了这样的思路我们就来实现一下代码,每个成员函数的第一个参数其实是隐藏的this指针。

C++类和对象(上)-CSDN博客

这里我们就可以回顾一下关于this指针的介绍。

看一下完整的代码:

如果月加到13了,就手动让其跳动到一月并且年也加一

这里也是一个构造函数,这里为什么要引进一个tmp的临时变量呢,就是因为这里是+,不会改变

原来的日期,这里要用传值返回不用引用返回,因为出了作用域临时对象的生命周期就结束了,所

以这里用传值返回。

这里就是错的,因为,这个加并不会改变他的值,所以要重新创建一个类来接收加完的值。

这两个写法是一样的

这样就正确了,我们看一下40天过后是不是11月21日

可以看出来是正确的。

三.日期类运算符+=的重载:

    上面写了+的运算符重载,其实现在就是改变原来的值,而上面的是自己不改变。

这里就是传引用返回,因为改变了其原本的值,所以直接用传引用返回,节省的传值返回的拷贝的

一个步骤

看一下运行结果:

既然加等写出来了,那么加的运算符重载就还有一个写法:

四.日期类运算符-的重载:

                           

这里用的思路是,原本的天数,减去往前推的天数,如果是小于0,就月往前推一个月,再用往前

推的那个月的天数去加那个小于0的天数,直到天数变为正即可,如果月数减到了0,那么就手动

减去一年,再手动将月调成12即可。

五.日期类运算符-=的重载:

    上面讲完减的运算符重载,其实-=跟+=的性质差不多,现在直接展示如何实现的:

    

六.日期类运算符<的重载:
 

这里就是如果年小就返回真,如果年相等就来比月,如果月小就返回真。如果月也相当,就返回天

的比较结果,如果天小就返回真,如果天大就返回假。其他情况并为一种就为假。

七.日期类运算符==的重载:

这里为什么先写==的运算符重载呢,因为再写后面的运算符这样就可以更简洁写出后面的运算符

重载。

八.日期类运算符重载<=的重载:

将上面两个<和<=的运算符重载写好后,可以直接赋用,使得<=的代码更加简洁高效。

因为前面的运算符已经写好了,所以直接赋用将两个参数传过去就行。

九.日期类运算符重载>的重载:

也就是取反一下,如果确实是小于等于那就为假,如果不是小于等于取反那就为真。

十.日期类运算符重载>=的重载:

总的来说这些大于等于的运算符先写两个出来然后其他的赋用一下就行了,非常的方便。

十一.日期类运算符重载++的重载:

重载++运算符时,有前置++和后置++,运算符重载函数名都是operator++,⽆法很好的区分。
C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,⽅便区分。
相较于前置++和后置++ , 前置++是加了以后的值去进行操作,后置++是先操作后++,所以后
置++就多了很多拷贝,所以比较推荐使用前置++
在这里有圈出来的两种调用方式,其实这里的值他并没有接受,只是多一个参数与前置++构成一
下函数重载,这样才能更好的区分。
后置++的实现:
这里因为是后置++,所以返回的是加了之前的值,所以要弄一个临时变量来接受一下,最后再利
用传值返回,这里不用引用返回的原因就是这个临时变量出了作用域就不存在了,所以不用引用返
回。
前置++的实现:
这里就可以直接用传引用返回了,因为返回的就是加完以后的值,这样就减少拷贝,使得代码更
简洁。
这里来测试一下:
后置++接受完++的值后,打印出来的还是原来的值,再打印本身的话就已经加上去了。而前置
++打印出来的都是加完以后的值。

十二.日期类运算符重载--的重载:

前面的代码小问题:

这里如果+=一个负数的话就会出错,所以我们在这里不仅要考虑的是给的是正数还是负数。

因为传过来的是负数,所以是往前推算时间,所以直接就赋用-=然后将传的值给正即可。

这样就正确了。

然而-=也要修改:

十三.日期减日期的实现:

思路一:就是往前借日期去减

                 

这里问题就出来了,如果往前借12个月,有的月是30天有的月是31天,所以就很难计算。所以

这种办法就会很麻烦。

思路二:

就是做一个横向的减法:

这个方法比上面的更加简单,但是代码实现起来也有点复杂

思路三:

我们赋用前面的逻辑,我们做了比较大小,所以我们就先用假设法去做一个谁大谁小,然后去累加

再定义一个计数器,不断累加,直到两者的天数相等即可。这个不断累加确实计算麻烦,但是cpu

的计算能力很强,和上面的时间差不了多少。

思路三的实现:

因为我们不知道this接受的是大日期还是小日期,所以用一个flag去做一个标志,如果this是小日期

那么相差的天数就是负的。

也就是还有108天过年。

结果也就是正确的。

十四.检查日期的正确与否:

日期类的整个大逻辑也是实现好了,但是如果3月有30天,但我给日期的时候给错了,给了31天,

虽然电脑能计算出来但是是错误的,所以我们在构造日期类的时候要做一个检查,不能让错误的日

期继续算。

这里如果检查出来为假 就取反变为真去走if语句里面的逻辑,然后打印一下非法日期,这里不用给

参数,直接有this指针去检查。

这里直接检查出了非法日期。

十五.日期类重载输出流:

在前面都是封装好了一个类去运行,我们这里想要自己去输入一个日期,并不想要封装好的怎么办

这里我们就需要重载一下输入输出流。

之前我们说过C++的cout将常见的内置类型都写好了,所以不用像C语言那样用什么%d去输入输出

所以在这个日期类我们自己来重载一下输入输出流。

这里cout是ostream的类型,所以这里用out引用一下。out就是cout

这里就出错了,没办法匹配上

因为这里有两个参数,还有一个隐含的this指针,所以应该是d1传给this指针,而cout传给out的引

用,这里我们倒过来写一下,看看能否运行成功。

这样就成功运行了,但是这样写明显变得倒反天罡,变得很难看,所以不能这么写。

当年写成日期类里面的成员函数时,都会有默认的this指针,我们将运算符重载函数写成成员函数

的目的就是访问私有变量,那我们如果不想要这个this指针,我们就写成全局变量,让cout传给第

一个参数,日期类传给第二个参数。但是这样不能访问私有变量了,这里直接剧透,我们在类和对

象下会学习友元函数,我们将输出流的运算符重载函数定义成友元函数,这样我就可以访问里面的

私有的成员变量

但这里还有一个问题我们无法连续调用这个运算符重载:

因为这个cout是从左向右结合的先与d1结合再与d2结合,但这里输出流的函数重载无返回值,所以

匹配不上,所以这里我们要改一下返回的类型,我们也要返回一下out,这样就能连续匹配调用

了;

这里流对象是不支持拷贝的,所以必须使用引用返回

这样就可以连续调用了。

十六.日期类重载输入流:

这里就不是ostream了,这里就是istream了。

这里我们来测试一下:

这里优化一下,检查我们输入的日期是否是非法日期,如果非法就重新输入。

十七.取地址运算符的重载:

1 const成员函数:

权限可以缩小但是权限不能放大

接下来我们看个例子:

将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后
⾯。
const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进⾏修改。
const 修饰Date类的Print成员函数,Print隐含的this指针由 Date* const this 变为 const
Date* const this, 所以就要在this指针前面加一个const,但是又因为this指针是隐藏的,在实参
形参的地方我们不能动。this指针前面是有个const的,是因为this指针是不能修改的。
解决方法就是在函数后面加一个const:
所以成员函数后面加加上const有极大的好处,普通对象和const对象都能调用,因为权限可以平移
和缩小,但是不能放大。但是不能一股脑的给所有成员函数加上const,因为有些函数就要修改成
员变量,不修改成员变量的建议加上const

2 取地址运算符重载:

取地址运算符重载分为 普通取地址运算符重载和const取地址运算符重载 ⼀般这两个函数编译器
⾃动⽣成的就可以够我们⽤了,不需要去显⽰实现 。除⾮⼀些很特殊的场景,⽐如我们不想让别⼈
取到当前类对象的地址,就可以⾃⼰实现⼀份,胡乱返回⼀个地址。
比如说这里使坏,不想让别人取到我日期类的地址:

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

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

相关文章

推挽电路(图腾柱)

推挽电路&#xff1a;Push-Pull 即推-拉的意思。 推挽电路本质是功率放大电路&#xff08;放大电流&#xff09;&#xff0c;增大输入信号的驱动能力&#xff0c;具有以下两个特点。 1 很强的灌电流&#xff0c;即向负载注入大电流。 2 很强的拉电流&#xff0c;即从负载抽取…

【vue3】图片上传功能实现

本次功能使用的是vue3elementplusnodejsmultiparty实现的图片上传与使用。 属于自行摸索的部分&#xff0c;有很大改进地方。目前思路是图片和数据分别上传&#xff0c;在上传图片时返回图片地址&#xff0c;将地址保存到表单数据中&#xff0c;在获取图片时&#xff0c;通过地…

智能优化算法-蛇优化算法(SO)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 蛇优化算法 (Snake Optimization Algorithm, SO) 是一种基于群体智能的元启发式优化算法&#xff0c;它模拟了蛇的捕食行为、运动模式和社会互动&#xff0c;用于解决复杂的优化问题。 SO的工作机制主要包括&a…

跨平台设计利器:五款免费UI设计工具推荐

1、即时设计 即时设计是一款国产的在线UI设计工具&#xff0c;它以其强大的原型设计功能和丰富的交互效果而受到设计师的喜爱。即时设计支持300多种交互效果&#xff0c;可以帮助设计师快速构建高保真原型。它还提供了设计交付功能&#xff0c;允许设计师直接在平台上创建用户…

版权科普:版权保护的常见误区,你中招了吗?

在当今信息爆炸的时代&#xff0c;版权保护成为了一个备受关注的话题。然而&#xff0c;对于版权保护&#xff0c;很多人存在着一些误解和误区。 首先&#xff0c;让我们来明确一下什么是版权保护。 版权保护指的是对文学、艺术和科学领域内具有独创性并能以某种有式复制的智力…

Linux系统使用NFS挂载共享目录

一、目的 服务器A 共享目录 /data 服务器B 挂载服务器A的目录 /data 服务器C 挂载服务器A的目录 /data … 上面的/data 只是举例&#xff0c;也可以是自定义的路径 二、常见的使用场景 ①、应用多实例多机器部署的情况下&#xff0c;有一些下载或者上传的模板文件&#xff…

taozige/Java语言的Netty框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码

云快充协议云快充1.5协议云快充1.6云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩协议云快充源码 介绍 云快充协议云快充1.5协议云快充1.6云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩协议云快充源码 软件架构 1、提供云快充底层桩直连协…

提升职场办公效率的电脑桌面悬浮窗便签有什么?

电脑桌面悬浮窗便签软件能够帮助我们更好地管理日常任务、记录灵感瞬间&#xff0c;提升职场办公效率&#xff0c;并且保持工作区的整洁。这类软件通常具备以下特点&#xff1a;简易实用、快速记录、功能齐全、以及跨平台同步功能等等。今天为大家推荐一款简单好用的电脑桌面悬…

高可用之限流-06-slide window 滑动窗口 sentinel 源码

限流系列 开源组件 rate-limit: 限流 高可用之限流-01-入门介绍 高可用之限流-02-如何设计限流框架 高可用之限流-03-Semaphore 信号量做限流 高可用之限流-04-fixed window 固定窗口 高可用之限流-05-slide window 滑动窗口 高可用之限流-06-slide window 滑动窗口 sen…

二维码:理解二维码 / 生成二维码 / 小程序支持哪种类型的二维码 / 小程序识别GS1码

一、理解二维码 1.1、概念 二维码&#xff08;2-dimensional bar code&#xff09;&#xff0c;又称二维条码&#xff0c;最早发源于日本&#xff0c;它是用某种特定的几何图形按一定规律在平面&#xff08;二维方向上&#xff09;分布的黑白相间的图形记录数据符号信息的&am…

10月15日 -- 11月15日 ,参与《人工智能导论》学习打卡赢B站大会员

一、活动参与地址 点击链接进行活动报名>>>https://momodel.cn/classroom/course/detail?id6173911eab37f12b14daf4a8&activeKeyinfo&srcbef3adb478 二、活动详情 进入链接点击报名&#xff0c;仅需每天参与吴超老师的《人工智能导论》打卡活动&#xff0…

day11-SpringMVC

一、SpringMVC 1.SpringMVC流程分析 2.各种注解 3.接收请求参数 3.1 简单类型 3.2 对象类型 3.3 数组类型 3.4 集合类型 3.5 日期类型 3.6 json参数类型 3.7 路径参数 二、统一异常处理 三、Restful

一个月学会Java 第16天 注解和异常处理

Day16 注解和异常处理 为什么一定要标注是元注解呢&#xff0c;这个原因其实非常的简单&#xff0c;因为注解现在还不能写&#xff0c;想要使用注解达到SpringMVC和SpringBoot的等级需要使用反射&#xff0c;但是反射我们现在还不会&#xff0c;所以就先讲讲最基本的元注解。 第…

MOS管的电路应用

MOS管的电路应用 MOS管的选型参考 1、MOS管类型 一般选择增强型NMOS管&#xff0c;同等工艺条件下&#xff0c;导通电阻Ron更小&#xff0c;发热更低&#xff0c;允许通过的电流更大&#xff0c;型号也更多。 2、Vgs电压 需要考虑开启电压&#xff0c;驱动电压&#xff0c;极…

每日一刷——10.14——括号匹配(手写栈来实现)

栈与队列题目 第一题 题目 问题描述】设计一个算法判别一个算术表达式的圆括号是否正确配对 【输入形式】一个以为结尾的算术表达式 【输出形式】若配对&#xff0c;则输出圆括号的对数&#xff1b;否则输出no 【样例输入】 (ab)/(cd) 【样例输出】 2 【样例说明】共有两对括…

带隙基准Bandgap电路学习(三)

一、导入器件到版图中 从原理图中导入器件&#xff1a; Connectivity——>Generate——>All From Source I/O Pins暂不添加&#xff0c;后面自己画 PR&#xff08;Primary Region&#xff09;Boundary: 通常是用来定义芯片设计中某些关键区域的轮廓&#xff0c;比…

揭秘数字时代的安全守护者:深入探索RSA加密算法的奥秘

目录 引言 一、什么是RSA&#xff1f; 二、RSA 的基本原理 三、RSA 加密的基本步骤 1、加密过程 2、解密过程 四、RSA例子 五、RSA 的特点 六、RSA 的安全性 七、RSA 的实际应用 总结 引言 在当今的信息化社会&#xff0c;数据的安全性和隐私保护已…

外包干了两年,女朋友跟别人跑了

在这个瞬息万变的IT行业&#xff0c;不进则退的道理&#xff0c;我算是深刻体会到了。作为一名本科生&#xff0c;21年通过校招&#xff0c;我幸运地踏入了广州某知名软件公司的大门&#xff0c;成为了一名功能测试工程师。那时的我&#xff0c;满怀激情与梦想&#xff0c;以为…

Neuromnia是一家创新的AI平台用Llama为自闭症护理领域带来全新解决方案

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Linux——Harbor(容器镜像 管理项目)

镜像拉取存在一定的问题&#xff0c;出现原因在于&#xff1a; 使用官方公共仓库中的镜像。 拉取的镜像&#xff0c;主要保存在一下仓库中&#xff1a; docker.io //Docker hub 最大的官方维护的公共镜像仓库&#xff0c;一般都会提供所有项目的最新版镜像&#xff0c;镜像…