赋值重载
赋值重载,首先我们先说一个运算符重载,什么是运算符重载呢?
当我们有一个日期类的话,我们想要对, 一个日期类进行比较,那么我们怎么比较呢?
我们是不是先得比较年的大小,然后是月的,最后是日的,但是我们用什么运算符比较呢??这里就要说到我们的运算符重载了。
我们先看一个如何比较大小
我们用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变量记录小的日期++了多少次,知道两个日期相等,我们就出入,然后返回刚才的计数器