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

文章讨论了C++中的运算符重载,特别是对于自定义类型如Date类的赋值和比较操作。通过示例解释了如何重载`<`运算符进行日期比较,以及`=`运算符进行赋值,并强调了赋值重载中连续赋值的问题,需要返回对象的引用以支持这种操作。此外,还提到了其他运算符如`==`,`<=`,`>`,`>=`,`+`,`-`的重载策略和注意事项。
摘要由CSDN通过智能技术生成

赋值重载

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

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

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

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

我们用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变量记录小的日期++了多少次,知道两个日期相等,我们就出入,然后返回刚才的计数器

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naxx Crazy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值