class operator overloading

class Date
{
public:
    Date(int y = 1, int m = 1, int d = 1)
    {
        if (y <= 0 || m <= 0 || m > 12 || d <= 0 || d > getday(y, m))
        {
            _y = 1;
            _m = 1;
            _d = 1;
        }
        else
        {
            _y = y;
            _m = m;
            _d = d;
        }
    }
    int getday(int y,int m)
    {

        static int _day[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
        int day = _day[m];
        if (m == 2&&((y%4==0&&y%100!=0)||y%400==0))
             day++;
            return day;
    }   
    Date& operator+=(int day)
    {
        _d += day;
        while (_d > getday(_y, _m))
        {
            _d -= getday(_y, _m);
            _m++;
            if (_m == 13)
            {
                _y++;
                _m = 1;
            }
        }
        return *this;
    }
    Date operator+(int day)
    {
        Date copy(*this);
        copy += day;
        return copy;
    }
    bool operator==(const Date& d)
    {
        return _y == d._y
            && _m == d._m
            && _d == d._d;
    }
    bool operator!=(const Date& d)
    {
        return !(*this== d);
    }
    Date operator-(int day)
    {
        Date ret(*this);
        ret -= day;
        return ret;
    }
    int operator-(const Date& d)
    {
        //计算相减问题转换为,小日期加天数等于大日期
        //自己天数就是相减天数
        Date max = *this;//假设原来的日期大
        Date min = d;
        int flag = 1;
        if (max < min)
        {
            max = d;
            min = *this;
            flag = -1;
        }
        int day_n =0;
        while (min < max)
        {
            min+=1;
            day_n++;
        }
        return day_n*flag;
        //返回值为正表示当前比传进来的日期大,反之小
    }
    Date& operator-=(int day)
    {

        _d -= day;
        while (_d<0)
        {

            if (_d < 0)
                _m--;
            if (_m == 0)
            {
                _y--;
                _m = 12;
            }
            //if (_y < 0)

            _d += getday(_y,_m);
        }
        return *this;
    }
    bool operator>(const Date& d)
    {
        if (_y > d._y)
            return true;
        else if (_y == d._y)
        {
            if (_m > d._m)
                return true;
            else if (_m == d._m)
            {
                if (_d > d._d)
                    return true;
            }
        }
        return false;
    }
    bool operator<(const Date& d)
    {
        /*if (_y < d._y)
            return true;
        else if (_y == d._y)
        {
            if (_m < d.m)
                return true;
            else if (_m == d._m)
            {
                if (_d < d._d)
                    return true;
            }
        }
        return false;*/
        return !(*this > d||*this==d);
    }
    bool operator<=(const Date& d)
    {
        return !(*this > d);
    }
    bool operator>=(const Date& d)
    {
        return (*this > d || *this == d);
        //return !(*this < d);
    }
    private:
        int _y;
        int _m;
        int _d;
};

Guess you like

Origin blog.51cto.com/14982125/2666768