实现日期类

来源:互联网 发布:淘宝发布宝贝过程好慢 编辑:程序博客网 时间:2024/06/17 09:24

题目:实现一个日期类,主要实现日期计算功能:

日期+天数=日期;

日期-天数=日期;

日期-日期=天数;

要实现该日期类,必须熟练掌握运算符重载的概念和实现方法。

以下是编写的一个日期类:

 

头文件:

#ifndef __DATE_H__#define __DATE_H__#include<iostream>using namespace std;class Date{public: Date(int year = 1900, int month = 1, int day = 1); Date(const Date& d); Date& operator=(const Date& d); int DaysOfMonth();//一个月的天数 bool IsInvalid();//判断非法输入 bool IsLeapYear();//判断闰年 void ToCorrectDate();//调整为正确的日期 Date& operator+=(int days); Date& operator-=(int days); friend ostream& operator<<(ostream& output, const Date& d);//输出运算符重载 friend bool operator>(const Date& d1, const Date& d2); friend bool operator>=(const Date& d1, const Date& d2); friend bool operator<=(const Date& d1, const Date& d2); friend bool operator<(const Date& d1, const Date& d2); friend bool operator==(const Date& d1, const Date& d2); friend bool operator!=(const Date& d1, const Date& d2);  friend Date operator+(const Date& d, int days);//日期+天数 friend Date operator-(const Date& d, int days);//日期-天数 friend int operator-(const Date& d1, const Date& d2);//日期-日期private: int _year; int _month; int _day;};#endif

源文件:

Date::Date(int year, int month, int day)//构造函数:_year(year), _month(month), _day(day){ if (IsInvalid())//若输入的日期不合法,则调整为合法日期 {      _year = 1900;      _month = 1;      _day = 1; }}Date::Date(const Date& d)//拷贝构造函数{     _year = d._year;     _month = d._month;     _day = d._day;}Date& Date::operator=(const Date& d)//赋值运算符重载{     _year = d._year;     _month = d._month;     _day = d._day;     return *this;}int Date::DaysOfMonth(){     int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };        //用数组的形式表示每个月的天数     if (IsLeapYear())//若为闰年则二月份天数为29天     {          days[2] += 1;     }         return days[_month];}bool Date::IsInvalid(){     if (_year < 1900 || _month < 0 || _month > 12 || _day < 0 || _day > DaysOfMonth())           return true;     else           return false;}bool Date::IsLeapYear(){     return (_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0;}ostream& operator<<(ostream& output, const Date& d)//输出运算符重载{     output << d._year << "-" << d._month << "-" << d._day;     return output;}bool operator==(const Date& d1, const Date& d2){     return (d1._year == d2._year) && (d1._month == d2._month) && (d1._day == d2._day);}bool operator!=(const Date& d1, const Date& d2){     return !(d1 == d2);}bool operator>(const Date& d1, const Date& d2){     if (d1._year > d2._year)          return true;     if (d1._year == d2._year)     {          if (d1._month > d2._month)               return true;      if (d1._month == d2._month)      {           if (d1._day > d2._day)          {                return true;          }      } } return false;}bool operator>=(const Date& d1, const Date& d2){     return (d1 > d2) || (d1 == d2);}bool operator<=(const Date& d1, const Date& d2){     return !(d1 > d2);}bool operator<(const Date& d1, const Date& d2){     return !(d1 >= d2);}void Date::ToCorrectDate(){     while (_day <= 0)     {      if (_month == 1)      {           _month = 12;           _year -= 1;      }      else           _month--;      _day += DaysOfMonth(); } while (_day > DaysOfMonth()) {      _day -= DaysOfMonth();      if (_month == 12)      {           _month = 1;           _year += 1;      }      else           _month++; }}Date operator+(const Date& d, int days){     Date d1(d);     d1._day += days;     d1.ToCorrectDate();     return d1;}Date& Date::operator+=(int days){     _day += days;     ToCorrectDate();     return *this;}Date operator-(const Date& d, int days){     Date d1(d);     d1._day -= days;     d1.ToCorrectDate();     return d1;}Date& Date::operator-=(int days){     _day -= days;     ToCorrectDate();     return *this;}int operator-(const Date& d1, const Date& d2){     Date MinDate(d1);     Date MaxDate(d2);     int days = 0;     if (d1 > d2)     {          MinDate = d2;          MaxDate = d1;     }     if (d1 < d2)     {          MinDate = d1;          MaxDate = d2;     }     while (MinDate != MaxDate)//较小的日期每次增加一天,直到与较大日期相等     {              MinDate += 1;              days++;//记录天数     }     return days;}

测试文件:

#include"date.h"int main(){     Date d1(2016, 1, 7);     Date d2(2016,1,3);     Date d;     int days = 100;     d = d1 + days;     cout << d1 <<" + "<< days <<": "<< d << endl;     d = d1 - days;     cout << d1 << " - " << days << ": " << d << endl;     days = d1 - d2;     cout <<d1 <<" - "<< d2<<": "<<days<< endl;     getchar();     return 0;}

 

0 0