Date.h文件
#pragma once #include<iostream> #include<assert.h> using namespace std; class Date { friend ostream& operator<<(ostream& out, const Date& d); friend istream& operator>>(istream& in, Date& d); public: // 获取某年某月的天数 int GetMonthDay(int year, int month); // 全缺省的构造函数 Date(int year = 1900, int month = 1, int day = 1); // 拷贝构造函数 // d2(d1) Date(const Date& d); // 赋值运算符重载 // d2 = d3 -> d2.operator=(&d2, d3) Date& operator=(const Date& d); // 日期+=天数 Date& operator+=(int day); // 日期+天数 Date operator+(int day) const; // 日期-天数 Date operator-(int day) const; // 日期-=天数 Date& operator-=(int day); // 前置++ Date& operator++(); // 后置++ Date operator++(int); // 后置-- Date operator--(int); // 前置-- Date& operator--(); // >运算符重载 bool operator>(const Date& d) const; // ==运算符重载 bool operator==(const Date& d) const; // >=运算符重载 bool operator >= (const Date& d) const; // <运算符重载 bool operator < (const Date& d) const; // <=运算符重载 bool operator <= (const Date& d) const; // !=运算符重载 bool operator != (const Date& d) const; // 日期-日期 返回天数 int operator-(const Date& d) const; void Print() const { cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; int _month; int _day; }; ostream& operator<<(ostream& out, const Date& d); istream& operator>>(istream& in, Date& d);
Date.cpp文件
#include"Date.h" // 获取某年某月的天数 int Date::GetMonthDay(int year, int month) { static int daysArr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) { return 29; } else { return daysArr[month]; } } // 全缺省的构造函数 Date::Date(int year, int month, int day) { if (month > 0 && month < 13 && day > 0 && day <= GetMonthDay(year, month)) { _year = year; _month = month; _day = day; } else { cout << "非法日期" << endl; assert(false); } } // 拷贝构造函数 // d2(d1) Date::Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } // 赋值运算符重载 // d2 = d3 -> d2.operator=(&d2, d3) Date& Date::operator=(const Date& d) { if (this != &d) { _year = d._year; _month = d._month; _day = d._day; } return *this; } // 日期-天数 Date Date::operator-(int day) const { Date tmp(*this); tmp -= day; return tmp; } // 日期-=天数 Date& Date::operator-=(int day) { if (day < 0) { return *this += -day; } _day -= day; while (_day <= 0) { --_month; if (_month == 0) { _month = 12; --_year; } _day += GetMonthDay(_year, _month); } 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) { ++_year; _month = 1; } } return *this; } // 日期+天数 Date Date::operator+(int day) const { Date tmp(*this); tmp += day; return tmp; } // 前置++ Date& Date::operator++() { *this += 1; return *this; } // 后置++ Date Date::operator++(int) { Date tmp = *this; *this += 1; return tmp; } // 后置-- Date Date::operator--(int) { Date tmp = *this; *this -= 1; return tmp; } // 前置-- Date& Date::operator--() { *this -= 1; return *this; } // >运算符重载 bool Date::operator>(const Date& d) const { return !(*this <= d); } // ==运算符重载 bool Date::operator==(const Date& d) const { return _year == d._year && _month == d._month && _day == d._day; } // >=运算符重载 bool Date::operator >= (const Date& d) const { return !(*this < d); } // <运算符重载 bool Date::operator < (const Date& d) const { if (_year < d._year) { return true; } else if (_year == d._year && _month < d._month) { return true; } else if (_year == d._year && _month == d._month && _day < d._day) { return true; } return false; } // <=运算符重载 bool Date::operator <= (const Date& d) const { return *this < d || *this == d; } // !=运算符重载 bool Date::operator != (const Date& d) const { return !(*this == d); } // 日期-日期 返回天数 int Date::operator-(const Date& d) const { Date max = *this; Date min = d; int flag = 1; int n = 0; if (*this < d) { max = d; min = *this; flag = -1; } while (min != max) { ++min; ++n; } return n * flag; } ostream& operator<<(ostream& out, const Date& d) { out << d._year << "年" << d._month << "月" << d._day << "日" << endl; return out; } istream& operator>>(istream& in, Date& d) { int year, month, day; in >> year >> month >> day; if (month > 0 && month < 13 && day > 0 && day <= d.GetMonthDay(year, month)) { d._year = year; d._month = month; d._day = day; } else { cout << "非法日期" << endl; assert(false); } return in; }
🍀小结🍀
种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波💕💕~~~,本文中也有不足之处,欢迎各位随时私信点评指正!