实现日期类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现日期类相关的知识,希望对你有一定的参考价值。

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

日期+天数=日期;

日期-天数=日期;

日期-日期=天数;

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

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

 

头文件:

#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;
}

 

以上是关于实现日期类的主要内容,如果未能解决你的问题,请参考以下文章

常用python日期日志获取内容循环的代码片段

JS代码片段:一个日期离现在多久了

sql 日期转换代码片段 - Dato,120,konvertere

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

日期选择器对话框在片段中不起作用[关闭]

Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段