1. 程式人生 > >C++完成日期類的實現--Date

C++完成日期類的實現--Date

實現日期類的一些功能:
操作符過載
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; }