C++完成日期類的實現--Date
阿新 • • 發佈:2018-12-22
實現日期類的一些功能:
操作符過載
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); //<=
Date operator+(int days); // 加天數
Date& operator+=(int days);// +=
Date operator-(int days); //減天數
int operator-(const Date& d); // 兩個日期相隔天數
Date& operator-=(int days); //-=
Date& operator++( ); //前置++
Date operator++(int); //後置++
Date& operator–( ); //前置–
Date operator–(int); //後置 –
bool IsLeapYear(int year);//判斷閏年?
int GetMonthDays( ); //一個月有多少天 ?
#include <iostream>
#include <assert.h>
using namespace std;
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1) //全預設建構函式
/* :_year(year)
,_month(month)
,_day(day) */
{
//檢查一個日期是否合法
if ((year >= 1900)
&& (month >= 1 && month <= 12)
&& (day >= 1 && day <= GetMonthDays()))
{
_year = year;
_month = month;
_day = day;
}
else
{
cout << "非法日期" << endl;
_year = 1900 ;
_month = 1;
_day = 1;
}
}
//Date(const Date& d)//拷貝建構函式
//{
// _year = d._year ;
// _month = d._month ;
// _day = d._day ;
//}//不用寫,系統會自動生成
//~Date()//解構函式
//{
// cout<<"~Date()"<<endl;
//}
void Print() const
{
cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
}
//d1 > d2
bool operator>(const Date& d)
{
if(_year > d._year)
{
return true;
}
else if(_year == d._year)
{
if(_month > d._month)
{
return true;
}
else if(_month == d._month)
{
if(_day > d._day)
{
return true;
}
}
}
return false;
}
bool operator == (const Date& d)
{
return _year == d._year
&& _month == d._month
&& _day == d._day ;
}
bool operator != (const Date& d)
{
//複用->可維護性
return !(*this==d);
}
bool operator < (const Date& d)
{
return !((*this > d) || (*this == d));
}
bool operator >= (const Date& d)
{
return !(*this < d);
}
bool operator <= (const Date& d)
{
return !(*this > d);
}
//d1 + 100
Date operator+(int day)
{
if(day < 0)
{
return *this-(-day);
}//如果day為負數,則呼叫減法操作符函式
Date tmp(*this);
tmp._day += day;
while(tmp._day > GetMonthDays())
{
tmp._day -= GetMonthDays();
tmp._month++;
if(tmp._month > 12)
{
tmp._year++;
tmp._month = 1;
}
}
return tmp;
}
Date operator+=(int day)
{
*this = *this + day;
return *this;
}
//day-10
Date operator-(int day)
{
if(day < 0)
{
return *this+(-day);
}
Date tmp(*this);
tmp._day = day;
while(tmp._day <= 0)
{
tmp._month--;
if(tmp._month == 0)
{
tmp._year--;
tmp._month = 12;
}
else
{
--tmp._month ;
}
tmp._day += GetMonthDays();
}
return tmp;
}
Date operator-=(int day)
{
*this = *this - day;
return *this;
}
Date operator++()//前置++
{
/*-day++;
if(_day > GetMonthDays())
{
_day -= GetMonthDays();
_month++;
if(_month > 12)
{
_year++;
_month = 1;
}
}
return *this;*/
//++也相當於加一天 複用->可維護性
*this += 1;
return *this;
}
Date operator++(int)//後置++ int用來區分前置和後置
{
Date tmp(*this);
*this += 1;
return tmp;
}
Date operator--() //前置--
{
*this -= 1;
return *this;
}
Date operator--(int)//後置--
{
Date tmp(*this);
*this -= 1;
return tmp;
}
int operator-(const Date& d)//兩個日期相隔天數
{
Date Max(*this);
Date Min(d);
int flag = 1;
if ( *this < d)
{
Max = d;
Min= *this;
flag = -1;
}
int days = 0;
while (Max > Min)
{
--Max;
++days;
}
return days*flag;
}
bool IsLeapYear(int year)//判斷是不是閏年
{
if(((_year%4 == 0)&&(_year%100 != 0)) || (_year%400 == 0))
{
return true;
}
else
return false;
}
int GetMonthDays()
{
static int MonthDays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int flag = IsLeapYear(_year);
/*if(_month = 2 && (((_year%4 == 0)&&(_year%100 != 0)) || (_year%400 == 0)))*/
if(_month = 2 && flag == 1)
{
return 29;
}
return MonthDays[_month];
}
private:
int _year;
int _month;
int _day;
};
void test1()
{
Date d1(2015,10,14);
Date d2(2017,10,15);
d1.Print();
d2.Print();
cout<<(d1 > d2)<<endl;
}
int main()
{
test1();
return 0;
}