C++日期类练习

#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;
}

猜你喜欢

转载自blog.csdn.net/Ferlan/article/details/80727824