实现一个日期类,可以进行日期的各种操作。
例如:
日期的大小,相等或不等的比较;
日期的前置后置自增自减;
日期+天数;
日期-天数;
日期-日期;
#include <iostream> using namespace std; #include <assert.h> class Date { public: //4个默认的成员函数 //构造、拷贝构造、赋值语句重载、析构函数 //构造函数 Date(int year=1900, int month=1, int day=1) :_year(year) ,_month(month) ,_day(day) { cout<<"初始化列表"<<endl; } //拷贝构造函数 Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } //析构函数 ~Date() { cout<<"~Date()析构函数:"<<endl; } //赋值语句重载 Date& operator=(const Date& d) { if(this != &d) { _year = d._year; _month = d._month; _day = d._day; } return *this; } public: //日期比较 bool operator==(const Date& d) { if((_year==d._year)&&(_month==d._month)&&(_day==d._day)) { return true; } else { return false; } } bool operator!=(const Date& d) { if((_year==d._year)&&(_month==d._month)&&(_day==d._day)) { return false; } else { return true; } } bool operator>(const Date& d) { if(_year>d._year) { return true; } if((_year==d._year)&&(_month>d._month)) { return true; } if((_year==d._year)&&(_month==d._month)&&(_day>d._day)) { return true; } return false; } bool operator>=(const Date& d) { if(((*this).operator==(d))&&(*this).operator>(d)) { return true; } else { return false; } } bool operator<(const Date& d) { if(!((*this).operator>(d))) { return true; } else { return false; } } bool operator<=(const Date& d) { if(((*this).operator<(d))&&((*this).operator==(d))) { return true; } else { return false; } } public: Date& operator++() //前置++ { _day = _day+1; if((_month == 1)|| (_month == 3)|| (_month == 5)|| (_month == 7)|| (_month == 8)|| (_month == 10)|| (_month == 12)) //处理大月份 { if(_day>31) { _month = _month+1; _day = 1; if(_month > 12) { _year = _year + 1; _month = 1; } } } else if((_month == 4)|| (_month == 6)|| (_month == 9)|| (_month == 11)) //处理小月份 { if(_day>30) { _month = _month + 1; _day = 1; } } else if(_month == 2) //如果为2月时,判断是否为闰年 { if((_year%4==0)&&(_year0!=0)||(_year@0==0)) { if(_day>29) { _month = _month + 1; _day = 1; } } else { if(_day>28) { _month = _month + 1; _day = 1; } } } return *this; } Date& operator++(int) //后置++ { Date tmp(*this); _day = _day+1; if((_month == 1)|| (_month == 3)|| (_month == 5)|| (_month == 7)|| (_month == 8)|| (_month == 10)|| (_month == 12)) //处理大月份 { if(_day>31) { _month = _month+1; _day = 1; if(_month > 12) { _year = _year + 1; _month = 1; } } } else if((_month == 4)|| (_month == 6)|| (_month == 9)|| (_month == 11)) //处理小月份 { if(_day>30) { _month = _month + 1; _day = 1; } } else if(_month == 2) //如果为2月时,判断是否为闰年 { if((_year%4==0)&&(_year0!=0)||(_year@0==0)) { if(_day>29) { _month = _month + 1; _day = 1; } } else { if(_day>28) { _month = _month + 1; _day = 1; } } } return tmp; } Date& operator--() //前置-- { _day = _day-1; if(_day==0) { _month = _month - 1; if((_month == 1)|| (_month == 3)|| (_month == 5)|| (_month == 7)|| (_month == 8)|| (_month == 10)) //处理大月份 { _day = 31; } else if((_month == 4)|| (_month == 6)|| (_month == 9)|| (_month == 11)) { _day = 30; } else if(_month == 2) { if((_year%4==0)&&(_year0!=0)||(_year@0==0)) //如果为闰年 { _day = 29; } else //如果不为闰年 { _day = 28; } } else if(_month == 0) //若减之前为1月时,减完需处理。 { _year = _year - 1; _month = 12; _day = 31; } } return *this; } Date& operator--(int) //后置-- { Date tmp(*this); _day = _day-1; if(_day==0) { _month = _month - 1; if((_month == 1)|| (_month == 3)|| (_month == 5)|| (_month == 7)|| (_month == 8)|| (_month == 10)) //处理大月份 { _day = 31; } else if((_month == 4)|| (_month == 6)|| (_month == 9)|| (_month == 11)) { _day = 30; } else if(_month == 2) { if(IsLeap()) //如果为闰年 { _day = 29; } else //如果不为闰年 { _day = 28; } } else if(_month == 0) //若减之前为1月时,减完需处理。 { _year = _year - 1; _month = 12; _day = 31; } } return tmp; } bool IsLeap() { if ((_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0) { return true; } return false; } int GetMonthDay(int year, int month) //计算一个某年某月有多少天 { assert(month > 0 && month <= 12); int arr_monthday[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int day; if ((!IsLeap()) && month == 2) { _day = arr_monthday[month] - 1; } day = arr_monthday[month]; return day; } //日期+天数 Date operator+(int day) { Date tmp(*this); if (day < 0) { return tmp + (-day); } tmp._day += day; while (tmp._day> GetMonthDay(tmp._year, tmp._month)) { tmp._day = tmp._day - GetMonthDay(tmp._year, tmp._month); if (tmp._month == 12) { tmp._year++; tmp._month = 1; } else { tmp._month++; } } return tmp; } 日期-天数 Date operator-(int day) { Date tmp(*this); if (day < 0) { return tmp - (-day); } tmp._day -= day; while (tmp._day<=0) { if (tmp._month == 1) { tmp._year--; tmp._month = 12; } else { --tmp._month; } tmp._day = tmp._day + GetMonthDay(tmp._year, tmp._month); } return tmp; } 日期-日期 int operator-(const Date& d) { Date Max(*this); Date Min(d); int flag = 1; if ( *this < d) { Max = d; Min= *this; flag = -1; } int days = 0; while (Max != Min) { --Max; ++days; } return days*flag; } void Display() { cout<<_year<<"-"<<_month<<"-"<<_day<<endl; } private: int _year;//年 int _month;//月 int _day;//日 }; 测试代码如下: int main() { Date d1(2017,1,1); Date d2(2018,2,2); Date d3(0,0,0); int days = 0; //d3 = ++d1; //d3 = d1++; //d3 = --d1; //d3 = d1+62; //d3 = d1-32; days = d2-d1; cout<<days<<endl; /*if(d1>=d2) { cout<<"1"<<endl; } else { cout<<"0"<<endl; }*/ return 0; }