类和对象-日期类的实现

#include<iostream>
using namespace std;

class Date
{
public:
    // 获取某年某月的天数
    int GetMonthDay(int year, int month) {
        static int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int day = days[month];
        if (month == 2)
        {
            if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
            {
                ++day;
            }
            return day;
        }
    }
    // 全缺省的构造函数
    Date(int year = 1900, int month = 1, int day = 1) {
        //判断日期是否有效
        if (year <= 0
            || month <= 0 || month > 12
            || day <= 0 || day > GetMonthDay(year, month))
        {
            cout << "日期无效" << endl;
            cout << "日期重置为: 1900-1-1 " << endl;
            _year = 1900;
            _month = 1;
            _day = 1;

        }
        else
        {
        _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) {
        if (*this != d)
        {
            _year = d._year;
            _month = d._month;
            _day = d._day;
        }
        return *this;
    }
    // 析构函数
    ~Date() {
    }
    // 日期+=天数
    Date& operator+=(int day) {
        if (day < 0)
        {
            return *this -= -day;
        }
        _day += day;
        //判断天数是否溢出
        while(_day > GetMonthDay(_year, _month))
        {
            //月份进位,首先减去当前月的天数
            _day -= GetMonthDay(_year, _month);
            //月份进位
            _month++;
            if (_month == 13)
            {
                _month = 1;
                ++_year;
            }
        }
        return *this;
    }
    // 日期+天数
    Date operator+(int day) {
        Date tmp = (*this);
        return tmp += day;
    }
    // 日期-天数
    Date operator-(int day) {
        Date tmp = (*this);
        return tmp -= day;
    }
    // 日期-=天数
    Date& operator-=(int day) {
        if (day < 0)
        {
            return *this += -day;
        }
        _day -= day;
        while (_day <= 0)
        {
            //月份回退
            --_month;
            //年份回退
            if (_month == 0)
            {
                --_year;
                _month = 12;
            }
            _day += GetMonthDay(_year, _month);
        }
        return *this;
    }
    // 前置++
    Date& operator++() {
        return *this += 1;
    }
    // 后置++
    Date operator++(int) {
        Date tmp = (*this);
        *this += 1;
        return tmp;
    }
    // 后置--
    Date operator--(int) {
        Date tmp = (*this);
        *this -= 1;
        return tmp;
    }
    // 前置--
    Date& operator--() {
        return *this -= 1;
    }
    // >运算符重载
    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;
    }
    // >=运算符重载
    inline bool operator >= (const Date& d) {
        return (*this > d) || (*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);
    }
    // 日期-日期 返回天数

    int operator-(const Date& d) {
        Date max = *this;
        Date min = d;
        int flag = 1;
        if (min > max)
        {
            max = d;
            min = *this;
            flag = -1;
        }
        int day = 0;
        while (min < max)
        {
            ++day;
            ++min;
        }
        return day * flag;
    }
    void display()
    {
        cout << _year << " " << _month << " " << _day << endl;
    }
 
private:
    int _year;
    int _month;
    int _day;
};

void test()
{
    Date d(2020, 10, 18);
    d += 10;
    d += 20;
    d.display();

}


int main()
{
    test();

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值