小工具知识网

当前位置: 首页 > 行业知识 > C++——日期类

行业知识

C++——日期类

2026-11-08 04:33:26 来源:互联网转载

前言:哈喽小伙伴们,在上一���文章中我们对C++类与对象的前半段知识进行了简单的分享,其中比较重要的莫过于C++类的六个默认成员函数。

所以这篇文章,我们通过实现一个完整的日期的操作,来对这些成员函数有一个更加深入的理解。


目录

一.基本框架

二.日期的比较

三.日期的加减运算

 1.得到月的天数

2.日期的加运算

3.日期的减运算

4.日期的++--运算

5.日期减日期

6.日期的输入输出

7.存在的问题

总结


一.基本框架

根据我们过去实现项目的方法,我们需要将声明与定义分离,同时还要实现测试代码与源代码分离,所以我们需要三个文件:

随后进行类的创建,基本成员函数的实现,以及测试代码的创建等框架。 

随后进行框架的测试:


二.日期的比较

两个日期之间的比较方式有很多种:>、”的写法:

bool operator>(const Date& d){ if (_year > d._year)return true;else if (_year == d._year){if (_month > d._month)return true;else if (_month == d._month)return _day > d._day;else    return false;}elsereturn false;}

但是就这一个的写法,就已经是很多,很麻烦的一段代码了,难道像这样的代码我们一共要写6个吗???当然不需要,我们要知道,这些符号之间都有两两互补的关系。

比如说,我们现在写出了“>”,那么“”取反吗:

bool Date::operator d);}

 我们建议把“==”给写出来,因为它比较容易写:

bool Date::operator==(const Date& d){return _year == d._year&& _month == d._month&& _day == d._day;}

如此一来,“!=”的写法就会是:

bool Date::operator!=(const Date& d){return !(*this == d);}

现在我们同时拥有了“>”和“==”,那么将两者结合自然就得到了“>=”:

bool Date::operator>=(const Date& d){return *this > d || *this == d;}

这样是不是非常的简洁???其余符号的代码就不一一列举啦,详情请看最后的完整代码展示。


三.日期的加减运算

日期的加减是一个相对比较困难的运算,它不像数字的加减那样简单,因为不仅存在大小月的天数不一,而且每四年还会出现闰年的特殊情况,这样就会导致进位非常的麻烦。下面我们就来详细分享一下,如此复杂的日期运算,到底该怎么实现。 


 1.得到月的天数

首先很重要的一点就是我们要能够知道每个月都分别有多少天,同时还有2月这个特殊的月份,我们通过一个函数来实现:

int GetMonthdays(int year, int month){assert(month > 0 && month  

首先要做的就是assert断言,防止月份输入错误,其次因为闰年是斯四年一次,所以我们默认情况下都是平年,通过数组来记录,能够方便获取。最后就是进行闰年二月的判断,如果2月,我们就去判断一下是否是闰年。 


2.日期的加运算

我们之间搬出代码来讲:

Date& Date::operator+(int day){_day += day;while(_day > GetMonthdays(_year, _month)){_day -= GetMonthdays(_year, _month);_month++;if (_month == 13){_year++;_month = 1;}}return *this;}

依旧是使用赋值运算符构造函数,我们直接让_day加上我们要加的天数,随后进行判断,如果相加之后的天数大于当月的天数,就让_day减去该月的天数,剩下的自然就是下个月的天数,同时月份+1,如果月份+1后是13,那就需要向年进一,同时月份回到1。

之所以使用循环,是因为如果我要加100天,那向月的进位就不止1了,所以要循环往复的判断。

下面我们进行测试:

#include"Date.h"int main(){Date d1(2024, 2, 1);Date d2 = d1 + 30;d2.Print();return 0;}

结果如下: 

1+30 = 31,而2024年恰巧就是闰年,所以2月有29天,31 - 29 = 2,所以结果为2024/3/2。 

但是这样的写法看似完美,但实际上存在一个很大的错误,来看代码:

#include"Date.h"int main(){Date d1(2024, 2, 1);Date d2 = d1 + 30;d2.Print();d1.Print();return 0;}

 我们是让d2对象去接收d1对象的日期加上20天后的日期,但实际上:

d1对象的日期也发生了改变。

这个错误其实也是可以理解的,因为我们在函数中直接默认进行操作的就是d1的成员变量。而这样的运算,实际上是“+=”运算。

所以想要保证d1的成员变量不变,就必须创建一个临时变量来代替:

Date Date::operator+(int day){Date tmp(*this);tmp._day += day;while (tmp._day > GetMonthdays(tmp._year, tmp._month)){tmp._day -= GetMonthdays(tmp._year, tmp._month);tmp._month++;if (tmp._month == 13){tmp._year++;tmp._month = 1;}}return tmp;}

 创建临时变量,就用到了我们的拷贝构造函数,使用tmp临时变量代替d1对象进行操作。

值得注意的一点是,由于tmp是临时的变量,当这个函数结束时就不存在了,所以其作为返回值时,返回类型不能是引用。 

再进行测试,结果如下:

 


3.日期的减运算

理解了加运算之后,减运算的写法相信小伙伴们都能够自己悟出来了。

唯一值得注意的是,日期没有0天:

//日期减等运算Date& Date::operator-=(int day){_day -= day;while (_day >”和“

上一篇:主机开10分钟就关机了怎么办

下一篇:0到12英语怎么写?