您的位置:首页 > 编程语言 > C语言/C++

C++日期类(运算符的重载)

2017-03-09 13:37 363 查看
日期类(运算符的重载)
在C++里可以实现运算符的重载,所以可以实现直接对日期类进行加减、比较等操作。

以下是整个Date.h头文件的源代码:

#pragma once
#include<cassert>
using namespace std;
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
:_year(year), _month(month), _day(day)
{
assert(IsInvalid()); //判断日期是否合法
}
Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
~Date()
{}
void Display() //打印日期类
{
cout << _year << "-" << _month << "-" << _day << endl;
}

bool IsInvalid() //判断日期是否合法
{
if (_year >= 1900 && _month > 0 && _month < 13 && _day>0 && _day <= GetMonthDays(_year, _month))
{
return true;
}
return false;
}
int GetMonthDays(int year, int month) //获取当前月份对应的天数
{
static int MonthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (month != 2)
{
return MonthDays[month];
}
else
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) //闰年
{
return 29;
}
return 28;
}
}
Date operator+(int day); //重载+
Date& operator+=(int day);//重载++
Date& operator++(); //前置++
Date operator++(int); //后置++

Date operator-(int day); //重载-
Date& operator-=(int day);//重载-=
Date& operator--(); //前置--
Date operator--(int); //后置--
int operator-(const Date& d); //两日期类对象相减返回一个整数

bool operator>(const Date& d); //重载>
bool operator<(const Date& d);
bool operator>=(const Date& d);
bool operator<=(const Date& d);
bool operator==(const Date& d);
bool operator!=(const Date& d);

private:
int _year;
int _month;
int _day;
};

inline Date Date::operator+(int day)
{
Date tmp(*this);
if (day < 0)
{
return *this - (-day);
}
tmp._day = _day + day;
while (!tmp.IsInvalid())
{
int MonthDay = GetMonthDays(tmp._year, tmp._month);
tmp._day -= MonthDay;
tmp._month++;
if (tmp._month == 13)
{
tmp._year++;
tmp._month = 1;
}
}
return tmp;
}
inline Date& Date::operator+=(int day)
{
*this = *this + day; //对加法重载的代码复用
return *this;
}
inline Date& Date::operator++() //前置++
{
return *this+=1;
}
inline Date Date::operator++(int) //后置++
{
Date tmp(*this);
*this += 1;
return tmp;
}
inline Date Date::operator-(int day)
{
Date tmp(*this);
if (day < 0)
{
return *this + (-day);
}
tmp._day = _day - day;
while (!tmp.IsInvalid())
{
if (tmp._month != 1)
{
tmp._month--;
}
else //month==1的情况
{
tmp._year--;
tmp._month = 12;
}
int MonthDay = GetMonthDays(tmp._year, tmp._month);
tmp._day += MonthDay;
}
return tmp;

}
inline Date& Date::operator-=(int day)
{
*this = *this - day;
return *this;
}
inline Date& Date::operator--() //前置--
{
return *this -= 1;
}
inline Date Date::operator--(int) //后置--
{
Date tmp(*this);
*this -= 1;
return tmp;
}
inline bool Date::operator>(const Date& d)
{
if (_year > d._year || (_year == d._year && (_month > d._month || (_month == d._month && _day > d._day))))
{
return true;
}
return false;
}
inline bool Date::operator<(const Date& d)
{
return !(*this > d || *this == d);
}
inline bool Date::operator>=(const Date& d)
{
return (*this > d || *this == d);
}
inline bool Date::operator<=(const Date& d)
{
return (*this < d || *this == d);
}
inline bool Date::operator==(const Date& d)
{
if (_year == d._year && _month == d._month && _day == d._day)
{
return true;
}
return false;
}
inline bool Date::operator!=(const Date& d)
{
return !(*this == d);
}
inline int Date::operator-(const Date& d) //两日期类对象相减返回一个整数
{
int count = 0;
Date tmp(*this);
Date tmp2(d);

if (tmp < tmp2) //第一个日期比第二个小交换顺序
{
Date x;
x = tmp;
tmp = tmp2;
tmp2 = x;
}

//处理_day使两个日期类的_day相同
count = GetMonthDays(tmp2._year, tmp2._month) - tmp2._day + tmp._day;
tmp2._day = tmp._day;
if (tmp._day >= tmp2._day) //count多加了一个月
{
tmp2._month++;
if (tmp2._month == 13)
{
tmp2._year++;
tmp2._month = 1;
}
}
//处理_month使两日期类_month相同
while (tmp._month != tmp2._month)
{
count = count + GetMonthDays(tmp2._year, tmp2._month);
tmp2._month++;
if (tmp2._month == 13)
{
tmp2._year++;
tmp2._month = 1;
}
}
//处理两日期类的_year
while (tmp._year > tmp2._year)
{
//判断是否为闰年,并且在二月份一下的才能算366天
if (((tmp2._year % 4 == 0 && tmp2._year % 100 != 0) || (tmp2._year % 400 == 0)) && (tmp2._month <= 2))
{
count += 366;
}
else
{
count += 365;
}
tmp2._year++;
}
return count;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: