#include<iostream>
using namespace std;
class Date
{
public:
// 获取某年某月的天数
int GetMonthDay(int year, int month)
{
int MonthArr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
if (month == 2 || (0 == month % 4 && month % 100 != 0) || (0 == month % 400))
return 29;
return MonthArr[month];
}
// 全缺省的构造函数
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
// 拷贝构造函数
// d2(d1)
Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
// 赋值运算符重载
// d2 = d3 -> d2.operator=(&d2, d3)
Date& operator=(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
// 析构函数
~Date()
{
//因为都是栈区可以不写;
_year = 0;
_month = 0;
_day = 0;
}
// 日期+=天数
Date& operator+=(int day)//修改原来的日期
{
Date& tmp = *this;
tmp._day += day;
while (GetMonthDay(tmp._year, tmp._month) < tmp._day)//直到月的天数合适
{
tmp._day -= GetMonthDay(tmp._year, tmp._month);
tmp._month += 1;
if (tmp._month > 12)
{
tmp._year += 1;
tmp._month -= 12;
}
}
return tmp;
}
// 日期+天数
Date operator+(int day)//不修改原来天数
{
Date tmp = *this;
tmp._day += day;
while (GetMonthDay(tmp._year, tmp._month) < tmp._day)//直到月的天数合适
{
tmp._day -= GetMonthDay(tmp._year, tmp._month);
tmp._month += 1;
if (tmp._month > 12)
{
tmp._year += 1;
tmp._month -= 12;
}
}
return tmp;
}
// 日期-天数
Date operator-(int day)
{
Date tmp = *this;
tmp._day -= day;
while (tmp._day<=0)//直到月的天数合适
{
tmp._month -= 1;//月份要减小
tmp._day += GetMonthDay(tmp._year, tmp._month);//加上下个月天数
if (tmp._month <=0 )
{
tmp._year -= 1;//去年
tmp._month += 12;//去月
}
}
return tmp;
}
// 日期-=天数
Date& operator-=(int day)
{
Date& tmp = *this;
tmp._day -= day;
while (tmp._day <= 0)//直到月的天数合适
{
tmp._month -= 1;//月份要减小
tmp._day += GetMonthDay(tmp._year, tmp._month);//加上下个月天数
if (tmp._month <= 0)
{
tmp._year -= 1;//去年
tmp._month += 12;//去月
}
}
return tmp;
}
// 前置++
Date& operator++()
{
*this += 1;
return *this;
}
// 后置++
Date operator++(int)
{
Date tmp = *this;
*this += 1;
return tmp;
}
// 后置--
Date operator--(int)
{
Date tmp = *this;
*this -= 1;
return tmp;
}
// 前置--
Date& operator--()
{
*this -= 1;
return *this;
}
// >运算符重载
bool operator>(const Date& d)
{
if (_year > d._year)
return true;
else if (_year == d._year && _month > d._month)
return true;
else if (_year == d._year && _month == d._month && _day > d._day)
return true;
else
return false;
}
// ==运算符重载
bool operator==(const Date& d)
{
if (_year == d._year && _month == d._month && _day == d._day)
return true;
else
return false;
}
// >=运算符重载
bool operator >= (const Date& d)
{
if (*this > d || *this == d)
return true;
else
return false;
}
// <运算符重载
bool operator < (const Date& d)
{
return !(*this >= d);
}
// <=运算符重载
bool operator <= (const Date& d)
{
return !(*this > d);
}
// !=运算符重载
bool operator != (const Date& d)
{
!(*this == d);
}
// 日期-日期 返回天数
int operator-(const Date& d)//很糟糕的一种写法,其实可以看年,月,一次加的跨度大一些,
{ //写一个获取该年有多少天,该年还剩多少天,目前已过多少天会更好
int ret = 0;
Date tmp = *this;
if (tmp >= d)
{
while (tmp > d)
{
tmp-=1;
ret++;
}
}
else
{
while (tmp < d)
{
tmp+=1;
ret--;
}
}
return ret;
}
//print
void PrintData()
{
cout << _year << " " << _month << " " << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date a(2023, 7, 22);
Date b(2023, 8, 10);
Date c = b + 19;
b--;
a++;
Date d=b--;
c.PrintData();
//cout << c << endl;
a.PrintData();
b.PrintData();
d.PrintData();//8,9
return 0;
}
日期类的实现,主要是重载各种运算符,和拷贝构造函数
最新推荐文章于 2024-07-25 20:22:48 发布