C++日期类(运算符的重载)

    xiaoxiao2021-03-25  134

    日期类(运算符的重载)

    在C++里可以实现运算符的重载,所以可以实现直接对日期类进行加减、比较等操作。

    以下是整个Date.h头文件的源代码:

    #pragma once #include<cassert> using namespace std; class Date { public: Date(int year = 1900, int month = 1, int day = 1) :_year(year), _month(month), _day(day) { assert(IsInvalid()); //判断日期是否合法 } Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } ~Date() {} void Display() //打印日期类 { cout << _year << "-" << _month << "-" << _day << endl; } bool IsInvalid() //判断日期是否合法 { if (_year >= 1900 && _month > 0 && _month < 13 && _day>0 && _day <= GetMonthDays(_year, _month)) { return true; } return false; } int GetMonthDays(int year, int month) //获取当前月份对应的天数 { static int MonthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (month != 2) { return MonthDays[month]; } else { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) //闰年 { return 29; } return 28; } } Date operator+(int day); //重载+ Date& operator+=(int day);//重载++ Date& operator++(); //前置++ Date operator++(int); //后置++ Date operator-(int day); //重载- Date& operator-=(int day);//重载-= Date& operator--(); //前置-- Date operator--(int); //后置-- int 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); bool operator!=(const Date& d); private: int _year; int _month; int _day; }; inline Date Date::operator+(int day) { Date tmp(*this); if (day < 0) { return *this - (-day); } tmp._day = _day + day; while (!tmp.IsInvalid()) { int MonthDay = GetMonthDays(tmp._year, tmp._month); tmp._day -= MonthDay; tmp._month++; if (tmp._month == 13) { tmp._year++; tmp._month = 1; } } return tmp; } inline Date& Date::operator+=(int day) { *this = *this + day; //对加法重载的代码复用 return *this; } inline Date& Date::operator++() //前置++ { return *this+=1; } inline Date Date::operator++(int) //后置++ { Date tmp(*this); *this += 1; return tmp; } inline Date Date::operator-(int day) { Date tmp(*this); if (day < 0) { return *this + (-day); } tmp._day = _day - day; while (!tmp.IsInvalid()) { if (tmp._month != 1) { tmp._month--; } else //month==1的情况 { tmp._year--; tmp._month = 12; } int MonthDay = GetMonthDays(tmp._year, tmp._month); tmp._day += MonthDay; } return tmp; } inline Date& Date::operator-=(int day) { *this = *this - day; return *this; } inline Date& Date::operator--() //前置-- { return *this -= 1; } inline Date Date::operator--(int) //后置-- { Date tmp(*this); *this -= 1; return tmp; } inline bool Date::operator>(const Date& d) { if (_year > d._year || (_year == d._year && (_month > d._month || (_month == d._month && _day > d._day)))) { return true; } return false; } inline bool Date::operator<(const Date& d) { return !(*this > d || *this == d); } inline bool Date::operator>=(const Date& d) { return (*this > d || *this == d); } inline bool Date::operator<=(const Date& d) { return (*this < d || *this == d); } inline bool Date::operator==(const Date& d) { if (_year == d._year && _month == d._month && _day == d._day) { return true; } return false; } inline bool Date::operator!=(const Date& d) { return !(*this == d); } inline int Date::operator-(const Date& d) //两日期类对象相减返回一个整数 { int count = 0; Date tmp(*this); Date tmp2(d); if (tmp < tmp2) //第一个日期比第二个小交换顺序 { Date x; x = tmp; tmp = tmp2; tmp2 = x; } //处理_day使两个日期类的_day相同 count = GetMonthDays(tmp2._year, tmp2._month) - tmp2._day + tmp._day; tmp2._day = tmp._day; if (tmp._day >= tmp2._day) //count多加了一个月 { tmp2._month++; if (tmp2._month == 13) { tmp2._year++; tmp2._month = 1; } } //处理_month使两日期类_month相同 while (tmp._month != tmp2._month) { count = count + GetMonthDays(tmp2._year, tmp2._month); tmp2._month++; if (tmp2._month == 13) { tmp2._year++; tmp2._month = 1; } } //处理两日期类的_year while (tmp._year > tmp2._year) { //判断是否为闰年,并且在二月份一下的才能算366天 if (((tmp2._year % 4 == 0 && tmp2._year % 100 != 0) || (tmp2._year % 400 == 0)) && (tmp2._month <= 2)) { count += 366; } else { count += 365; } tmp2._year++; } return count; }

    转载请注明原文地址: https://ju.6miu.com/read-11191.html

    最新回复(0)