C++默认成员函数 日期类运算符重载

news2024/11/25 23:31:23

赋值重载

赋值重载,首先我们先说一个运算符重载,什么是运算符重载呢?

当我们有一个日期类的话,我们想要对, 一个日期类进行比较,那么我们怎么比较呢?

 我们是不是先得比较年的大小,然后是月的,最后是日的,但是我们用什么运算符比较呢??这里就要说到我们的运算符重载了。

我们先看一个如何比较大小

我们用operator重载<符号,由于编译器并不知道我们的自定义类型如何进行比较,所以我们需要重载一些,我们自己写一下如何比较

 我们来看一下,由于我们重载的是<符号,而<符号需要两个参数,也就是所谓的二元运算符,但是我们这个是成员函数,所以我们的函数里面自带隐层的this指针,所以只需要在括号里面传一个参数。

operator后面加运算符,就是运算符重载,返回值由运算符的运算结果来看,或者是自己的类的运算结果。

所以现在我们在看赋值重载

首先赋值重载就是我们需要operator=重载赋值符号

 我们先看一些这样子赋值重载正确吗??

 我们想把d1 赋值给 d2我们看一下是否会成功

 

首先我们是这样的,那么我们现在来看一下

 

我们看到成功赋值了,但是这样真的是正确的吗?

我们在来看一个,假设我们想要对几个变量连续赋值

 

 

 我们看一下是什么样子

我们看到全部赋值为了1

那么我们的Date类的可以连续赋值吗?

 

 我们看到报错了 ,为什么呢? 因为连续赋值用的是赋值之后的返回值,但是我们的赋值重载的返回值是void,所以无法连续赋值,那么我们现在修改一下,但是返回值是什么呢?

我们是日期给日期类的赋值,所以返回值一定是一个日期,我们在看一下,我们的把d1的值赋值给d2,赋值后d2依然存在,所以我们可以返回日期类的引用,这样可以提高效率

 因为是把d赋值给this指针指向的值,所以等赋值结束后,我们直接返回*this就可以了

但是我们现在在想一下,这样就可以了吗?? 假设我们是自己给自己赋值呢? 或者是自己给自己赋值又不要吗?那么我们还可以在修改一下

我们判断一下,如果不是自己给自己赋值,我们在进行赋值

我们的赋值重载就到这

那么下面我们就继续讲一下Date类

Date类

 刚才我们已经讲了Date类的两个运算符重载,operator=和operator<,那么我们继续讲一下其他的运算符重载

operator==

如果我们想判断一个日期是否相等,那么我们就判断它的年月日是否相等就可以了

就是这么简单

operator<= 

那么我们的小于等于怎么写呢? 我们刚才写了小于,现在要写小于等于,是不是继续判断一下,看年是否小于等于,月是否小于等于,和日是否小于等于呢? 不是! 这样太麻烦了,我们可以进行复用,既然我们写了小于的重载和等于的重载,那么只要我们的*this<d 或者*this==d就是小于等于

operator> 

当然我们的其他运算符也可以复用, 大于就是小于等于取反就可以了

operator>= 

大于等于就是不小于

operator+=

 我们在想一下,我们的日期类还可以重载那些运算符,我们的日期加日期有意义吗??没有!那么我们的日期加天数有意义吗? 是的! 我们的日期加天数,就是多少天后是几月几日,那么我们就重载一下日期加天数

那么如果我们现在想一个日期加一天会有什么变化吗? 如果是月末的话,那么我们是不是需要往月上面进一,如果我们加的天数超过了一年,我们还需要对年进位,所以我们的日期加天数就是进位就可以了,但是我们怎么知道我们这个月多少天呢? 所以我们还需要一个计算该年分这个域多少天

GetMonthDay(int year, int month)

这个函数并不难,我们就不多说了

有了这个函数,我们继续说,我们首先可以把天数加到_day上,然后我们判断一下这个_day是否合法,也就是在对应年份的该月下的天数是否满足,如果满足的话就直接结束,如果超出该月本来的天数的话,就需要对_day-=该月本来的天数,然后对_month进位,如果_month也大于12,就素要对年进位,下面我们来看一下

 但是这个是 +=,如果我们不想改变原来的日期呢? 这个时候我们就需要+了

operator+ 

但是我们如何重载+呢?我们还是可以复用,我们只需要有一个和原来如期一米一样的日期tmp,然后我们对tmp进行+=天数,我们返回tmp就可以了

 也不难

operator-=

那么我们如何实现-=呢?

我们还是可以像+=一样,我们先对原来的天数-=想要-=的天数,然后我们判断天数和对应的月份是否合法,如果不合法,我们就需要对月份进行-=1了,如果_month<1那么我们还需要调整年,下面我们来看一下

 不过这一次,如果我们-=天数后,如果天数<0那么说明本月已经结束了,我们得看是否满足上一个月的天数所以,我们就不是判断是否是满足本月的天数了,而是上一个月,所以如果我们的_day<0我们就直接先天正月分,让_month--<然后我们在判断月份是否满足,调整年份,然后我们就继续对_day+=本月的天数

operatoe-

当然,-=也是会改变日期,如果我们不想改变日期的话,我们就可以重载-

我们的-也可以复用-=,就像+复用+=一样

operator++

 如果我们像对日期类进行++呢?当然这里的++是+一天,但是我们仔细像一下,我们有一个前置++和后置++,我们要怎么区分呢? 我们还是先看一下前置++吧

前置++很简单就是复用+=1就可以了

 就是这样,但是我们怎么区分前置和后置呢? 在我们的语法规定,我们的后置需要在operator++()的括号里面放一个int进行占位,就像这样

也并不难,而且这个int并不是为了传参,而是为了区分,所以什么参数都不需要传

operator-- 

当然--的前置和后置的区分也是和++是相同的,下面我们来看一下

operator!=

 不等于就是==取反

还剩下最后一个,如果我们的日期-日期有意义吗 ?当然有,就是我们的天数

所以我们还可以函数重载,我们对operator-进行重载,刚才是operator-(int day)减1的是天数,现在我们可以重载为operator-(Date& d)减日期

那么我们日期-日期如何计算时间呢?

我们可以判断传过来的两个如期的大小,记录下来,然后对小的日期进行++如果然后在用一个count变量记录小的日期++了多少次,知道两个日期相等,我们就出入,然后返回刚才的计数器

 

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

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

相关文章

day6 socket套接字及TCP的实现框架

socket套接字 Berkeley UNIX 操作系统定义了一种API它又称为套接字接口&#xff08;socket interface); socket作用&#xff1a; socket常见API介绍 /*创建套接字*/ int socket(int domain, int type, int protocol); /*绑定通信结构体*/ int bind(int sockfd, const, struc…

【数据库】MVCC原理详解

文章目录 前言1. 相关数据库知识点回顾1.1 什么是数据库事务&#xff0c;为什么要有事务1.2 事务包括哪几个特性&#xff1f;1.3 事务并发存在的问题1.3.1 脏读1.3.2 不可重复读1.3.3 幻读 1.4 四大隔离级别1.4.1 读未提交1.4.2 读已提交1.4 3 可重复读1.4.4 串行化1.4.5 四大隔…

chatgpt模拟机器人软件开发

ChatGPT的参数取决于具体的模型和实现方式&#xff0c;但以下是一些常见的ChatGPT参数&#xff1a; 模型深度&#xff1a;指模型中神经网络的层数。通常情况下&#xff0c;层数越多&#xff0c;模型的表达能力也就越强。 隐藏单元大小&#xff1a;指在模型中每个隐藏层…

局域网 - CSMA/CD(载波侦听多路访问 / 冲突检测)

文章目录 1 概述1.1 局域网的拓扑结构 2 CSMA/CD2.1 三种监听算法2.2 冲突检测原理2.3 二进制指数后退算法 3 扩展3.1 网工软考真题 1 概述 1.1 局域网的拓扑结构 2 CSMA/CD CSMA/CD&#xff1a;Carrier Sense Multiple Access/ Collision Detection&#xff0c;载波侦听多路…

从功能测试转型测试开发,薪资涨了20K,1000字讲述转型必经之路...

身处职场之中&#xff0c;犹如逆水行舟不进则退&#xff0c;想要不被后浪拍死在沙滩上&#xff0c;就要不断学习新知识&#xff0c;接受新事物。 要得到更好的发展&#xff0c;就要紧跟发展趋势&#xff0c;不断转型才能保持竞争力&#xff0c;在职场中占有一席之地。 转型不…

如何理解自动化测试数据驱动与关键字驱动的区别?

一、关键字驱动KDT(Keyword-driven testing) 1、自动化测试框架发展的第三个阶段是关键字驱动测试框架阶段&#xff0c;它是当前比较流行的一种框架之一&#xff0c;并且现在的自动化测试工具已经将关键字驱动框架融入到工具中。在录制过程中自动化测试工具会将对象及操作属性保…

如何提高倾斜摄影超大场景的三维模型轻量化处理速度和效率?

如何提高倾斜摄影超大场景的三维模型轻量化处理速度和效率&#xff1f; 倾斜摄影超大场景的三维模型轻量化处理是将高精度的三维模型进行降采样、简化等处理&#xff0c;以达到减少数据大小和提高渲染性能的目的。为了提高轻量化处理速度&#xff0c;可以从以下方面入手&#x…

【Java 】Java 类加载和类加载器

文章目录 前言一、加载二、链接验证准备解析 三、初始化发生的时机不会触发类的初始化 四、类加载器双亲委派模式 前言 Java 的类加载阶段分为&#xff1a;加载、链接、初始化&#xff0c;而链接的过程中包括&#xff1a;验证、准备、解析。 一、加载 将类的字节码载入方法区…

vue3新拟态组件库开发流程——table组件源码

基础表格 首先开发table组件之前&#xff0c;先想好要用什么样式的api&#xff0c;因为笔者在生产工作中用的都是element&#xff0c;所以前面几个组件风格和element类似&#xff0c;但是这次不打算用element的风格了&#xff0c;打算换一种&#xff0c;直接展示&#xff1a; …

LinkedHashMap顺序迭代原理与LRU算法实现

一、LinkedHashMap与HashMap的结构区别 HashMap LinkedHashMap 结构区别&#xff1a;LinkedHashMap的元素Entry中多两个用于维护双向链表的指针before、after&#xff0c;并且在LinkedHashMap中有两个head、tail指针用于记录双向链表的头结点和尾结点。 二、LinkedHashMa…

2.3 定点乘法运算

学习目标&#xff1a; 如果我要学习定点乘法运算&#xff0c;我会按照以下步骤进行学习&#xff1a; 确定学习目标&#xff1a;明确学习定点乘法运算的目的和重点&#xff0c;以便有针对性地进行学习。 掌握基础知识&#xff1a;首先需要了解定点数和定点乘法的基础知识&…

【halcon】半透明和棋盘格(未完成)

背景 想实现一个这样的效果&#xff1a; 但是发现设置HSmartWindowControlWPF 的Background 根本就没有反应。 探索过程 于是就换个思路&#xff0c;把棋盘格画到Border里面。 <Border Grid.Row"1" Grid.ColumnSpan"2" Panel.ZIndex"0" >…

MySQL:数据库的基本操作

MySQL是一个客户端服务器结构的程序, 一.关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 主流的关系型数据库包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2 等. …

mitmproxy抓包

0.mitmproxy功能简介 实时拦截、修改 HTTP/HTTPS 请求和响应可保存完整的 http 会话&#xff0c;方便后续分析和重放支持反向代理模式将流量转发到指定服务器支持 macOS 和 Linux上的透明代理模式支持用 Python 脚本对 HTTP 通信进行修改 1. 安装mitmproxy pip3 install mit…

wow.js scrollReveal.js 动画库 使用详解以及优劣

wow.js 1.简介 有的页面在向下滚动的时候&#xff0c;有些元素会产生细小的动画效果。比如需要做到滚动条滑到某个位置时&#xff0c;才能显示动画。wow.js 依赖 animate.css&#xff0c;所以它支持 animate.css 多达 60 多种的动画效果&#xff0c;能满足您的各种需求。 IE6、…

Python+Qt掌纹识别

程序示例精选 PythonQt掌纹识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonQt掌纹识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

安卓GB28181-2022 RTP over TCP

使用TCP传输RTP包&#xff0c;GB28181-2016和GB28181-2022 都是按IETF RFC4571来的。使用TCP发送RTP包&#xff0c;前面加个16位无符号长度字段就好(网络字节序)。具体定义格式如下&#xff1a; 需要注意的是LENGTH值可以是0&#xff0c;0的话表示空包; 另外UDP传输RTP包&#…

【华为云主机迁移服务SMS,使用指南 (linux版本)】

文章目录 华为云主机迁移服务SMS,使用指南 (linux版本)1.迁移前准备工作1.1 必要条件1.2 准备 (注意切换浏览器) 2.在源端(A服务器)安装Agent (linux版), 连接到B的华为云SMS3.设置目的端(B服务器)--在B浏览器内操作4.开始服务器复制5.启动目的端 (B)6.其他非必要操作 华为云主…

KDZD地埋线短路漏电试扎器

一、产品背景 多年以来&#xff0c;电力电缆的维护迁移过程中的识别与刺孔&#xff0c;均按照行业标准DL409-91《电业安全工作规程&#xff08;电力线路部分&#xff09;》第234条要求&#xff0c;采用人工刺孔&#xff0c;一旦电缆识别出错&#xff0c;误刺孔带电电缆将对人身…

就现在!体验高科技的虚拟孪生

01 行业创新已成大势所趋 世界进入工业复兴大约已有十余载&#xff0c;众多行业开始向数字化转型&#xff0c;尖端技术取代了老旧的数字技术。对于制造商而言&#xff0c;在将运营控制在预算范围内的同时&#xff0c;保持满足这些需求所需的产量&#xff0c;是一项巨大的挑战。…