C++实现一个日期类

来源:互联网 发布:同花顺炒股交易软件 编辑:程序博客网 时间:2024/06/10 11:56

此日期类可以实现类似于日期计算器的功能,如日期几天之后的日期,几天之前的日期,两个日期相差多少天等,使用了类的基本成员函数,熟悉了如何使用类的成员函数以及操作符重载。

#include <iostream>using namespace std;//日期类class Date{public://默认的构造函数Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){if (year <1900 || (month<1 || month>12) || (day<1 ||day> Getmonthday(_year, _month))){exit(1); //不符合的日期报错}}//赋值运算符重载,看是否给自己赋值Date& operator=(const Date& d){if (*this != d){_year = d._year;_month = d._month;_day = d._day;}return *this;}//拷贝构造函数Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}//析构函数~Date(){}//获取某年某月有多少天,闰年和平年的二月份的天数不同int Getmonthday(int year,int month){int arr[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if (year % 400==0 || (year % 4 == 0 && year % 100 != 0)){arr[2] += 1;return arr[month];}return arr[month];}// 前置++,必须返回被增量或减量的引用Date& operator++(){_day += 1;if (_day > Getmonthday(_year, _month)){_month += 1;if (_month > 12){_year += 1;_month = 1;}}return *this;}// 后置++,返回旧值,先赋值,后自增 Date operator++(int){return *this;}//前置--Date& operator--(){_day -= 1;if (_day == 0){_month -= 1;if (_month == 0){_year -= 1;_month = 12;}_day = Getmonthday(_year, _month);//天数也需要变化;}return *this;}//后置--Date operator--(int){return *this;}//days天之后的日期 Date operator+(int day){if (day<0){return *this - (-day);}_day += day;while(_day > Getmonthday(_year, _month)){_day = _day - Getmonthday(_year, _month);_month += 1;if (_month > 12){_year += 1;_month = 1;}}return *this;}// days天之前的日期 Date operator-(int day){if (day < 0){return *this + (-day);//如果减去负天,相当于向后+多少天}_day -= day;while (_day <= 0){_month -= 1;if (_month == 0){_month = 12;_year -= 1;}int k = Getmonthday(_year, _month);_day = k - (-_day);}return *this;}// 两个日期之间的距离 int operator-(const Date& d){int count=0;Date min = *this;Date max = d;if (min > max){Date temp = min;min = max;max = temp;}while (min != max){max.operator--();  //大的日期自减,减一天count加一天,直到与小的日期相等count++;}return count;}//逻辑运算符,与或非,&& || !bool operator==(const Date& d){return (_year == d._year && _month == d._month && _day == d._day);}bool operator!=(const Date& d){return (_year != d._year||_month != d._month||_day != d._day);//return !(*this==d);}bool operator>(const Date& d){if (_year > d._year){return true;}else{if (_month > d._month){return true;}else{if (_day > d._day){return true;}else{return false;}}}}bool operator<(const Date& d){if (_year < d._year){return true;}else{if (_month < d._month){return true;}else{if (_day < d._day){return true;}else{return false;}}}}void Display(){cout << _year << " " << _month << " " << _day << endl;}private:int _year;int _month;int _day;};void FunTest(){Date d1(2016,3,29);d1.Display();Date d2(2016,1,20);int ret = d2-d1;cout << ret << endl;}int main(){FunTest();getchar();return 0;}


原创粉丝点击