#include<iostream>
#include<windows.h>
using namespace std;
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)//构造函数
:_year(year)
, _month(month)
, _day(day)
{
if (!IsInvalid()) //判断日期的合法性
{
/*assert(false);*/
cout << "非法日期" << _year << "-" << _month << "-" << _day << endl;
}
}
Date(const Date& d) //拷贝构造函数
{
_year = d._year;
_month = d._month;
_day = d._day;
}
Date& operator=(const Date& d)//赋值运算符重载
{
if (this != &d)//排除自己给自己赋值的情况
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
~Date() {}; //析构函数
bool IsInvalid() //日期合法性检查
{
if (_day <= GetMonthDay(_year, _month) && _month > 0 && _month < 13)
{
return true;
}
else
return false;
}
bool isLeapYear(int year) //判断是否是闰年
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
return true;
}
else
return false;
}
int GetMonthDay(int year, int month)// 取得对应月份的最大天数
{
static int arr[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
if (isLeapYear(_year))
{
arr[2] = 29;
}
return arr[month];
}
void Show() //打印日期
{
cout << _year << "-" << _month << "-" << _day << endl;
}
//以下是各类运算符重载:
bool operator==(const Date& d)
{
if (_year == d._year&&
_month == d._month&&
_day == d._day)
{
return true;
}
return false;
}
bool operator!=(const Date& d)
{
return !(*this == d);
}
bool operator>=(const Date& d)
{
return !(*this < d);
}
bool operator<=(const Date& d)
{
return !(*this > d);
}
bool operator>(const Date& d)
{
if ((_year > d._year) ||
(_year == d._year&&_month > d._month) ||
(_year == d._year&&_month == d._month&&_day > d._day))
{
return true;
}
else
return false;
}
bool operator<(const Date& d)
{
if ((_year < d._year) ||
(_year == d._year&&_month < d._month) ||
(_year == d._year&&_month == d._month&&_day < d._day))
{
return true;
}
else
return false;
}
Date operator+(int day)
{
Date d1(*this);
int myday = d1._day + day;
while (myday >= GetMonthDay(d1._year, d1._month))
{
myday -= GetMonthDay(d1._year, d1._month);
d1._month++;
if (d1._month > 12)
{
d1._month = 1;
d1._year++;
}
}
d1._day = myday;
return d1;
}
Date& operator+=(int day)
{
int myday = _day + day;
while (myday >= GetMonthDay(_year, _month))
{
myday -= GetMonthDay(_year, _month);
_month++;
if (_month > 12)
{
_month = 1;
_year++;
}
}
_day = myday;
}
Date& operator-=(int day)
{
int myday = _day - day;
while (myday <= 0)
{
myday += GetMonthDay(_year, _month);
_month--;
if (_month == 0)
{
_month = 12;
_year--;
}
}
_day = myday;
return *this;
}
Date operator-(int day)
{
Date d(*this);
int myday = d._day - day;
while (myday <= 0)
{
myday += GetMonthDay(d._year, d._month);
--d._month;
if (d._month == 0)
{
d._month = 12;
d._year--;
}
}
d._day = myday;
return d;
}
Date& operator++() // 前置
{
*this = (*this) + 1;
return *this;
}
Date operator++(int) // 后置
{
Date d(*this);
(*this) = (*this) + 1;
return d;
}
Date& operator--()//前置
{
(*this) = (*this) - 1;
return *this;
}
Date operator--(int)
{
Date d(*this);
(*this) = (*this) - 1;
return d;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
//d1.Show();
Date d2(2017, 2, 28);
//d2.Show();
++d1; // d1.operator++(&d1);
d1++; // d1.operator++(&d1, 0);
return 0;
system("pause");
return 0;
}
C++日期类练习
猜你喜欢
转载自blog.csdn.net/Ferlan/article/details/80727824
今日推荐
周排行