下面的日期类主要实现的功能有 1.日期类的四大默认成员函数:构造函数,拷贝构造函数,赋值操作符重载,析构函数 2.输入操作符重载,输出操作符重载 3.日期的比较 4.日期+天数 5.日期-天数 6.日期-日期
#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<iostream> using namespace std; class Date { friend ostream& operator<<(ostream &io, const Date& d); friend istream& operator>>(istream &is, Date& d); public: //4个默认的成员函数 //构造、拷贝构造、赋值语句重载、析构函数 Date(int year, int month, int day); Date(const Date& d); ~Date(); Date& operator=(const Date& d); public: //日期比较 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); public: Date& operator++(); Date operator++(int); Date& operator--(); Date operator--(int); //日期+天数 Date& operator+(int day); //日期-天数 Date& operator-(int day); //日期-日期 int operator-(Date& d); public: bool isLeapYear(const Date&d) { if ((d._year % 4 == 0) || (d._year % 400 == 0 && d._year % 100 == 0)) { return true; } else { return false; } } public: int GetMonthDay(const Date& d); //得到本月的天数 Date GetNextMonthDay(Date& d); //得到下一个月的天数 Date GetUpMonthDay(Date& d); //得到上一个月的天数 private: int _year;//年 int _month;//月 int _day;//日 }; Date Date::GetNextMonthDay(Date& d) { if (d._month + 1 == 13) { d._month = 1; } else { d._month += 1; } return d; } Date Date::GetUpMonthDay(Date& d) { if (d._month - 1 == 0) { d._month = 12; } else { d._month -= 1; } return d; } int Date::GetMonthDay(const Date& d) { switch (d._month) { case 1: return 31; break; case 2: { if (isLeapYear(d)) { return 29; } else { return 28; } } break; case 3: return 31; break; case 4: return 30; break; case 5: return 31; break; case 6: return 30; break; case 7: return 31; break; case 8: return 31; break; case 9: return 30; break; case 10: return 31; break; case 11: return 30; break; case 12: return 31; break; default: break; } } ostream &operator<<(ostream &io, const Date& d) { io << d._year << "-" << d._month << "-" << d._day; return io; } istream &operator>>(istream& is, Date&d) { is >> d._year >> d._month >> d._day; return is; } Date::Date(int year,int month,int day) :_year(year) , _month(month) , _day(day) { //cout << "Date(int year,int month,int day)" << endl; } Date::Date(const Date& d) { this->_year = d._year; this->_month = d._month; this->_day = d._day; //cout << "Date(const Date& d)" << endl; } Date::~Date() { //cout << "~Date()" << endl; } Date& Date::operator=(const Date& d) { if (*this != d) { this->_year = d._year; this->_month = d._month; this->_day = d._day; } //cout << "operator=(const Date& d)" << endl; return *this; } bool Date::operator==(const Date& d) { if ((this->_year == d._year) && (this->_month == d._month) && (this->_day == d._day)) { return true; } return false; } bool Date::operator!=(const Date& d) { if (*this == d) { return false; } return true; } bool Date::operator>(const Date& d) { if (this->_year == d._year) { if (this->_month == d._month) { if (this->_day == d._day) { return false; } else if (this->_day > d._day) { return true; } else { return false; } } else if (this->_month > d._month) { return true; } else { return false; } } else if (this->_year > d._year) { return true; } else { return false; } } bool Date::operator>=(const Date& d) { if ((*this == d) || (*this>d)) { return true; } else { return false; } } bool Date::operator<(const Date& d) { if (*this==d) { return false; } else if (*this > d) { return false; } else { return true; } } bool Date::operator<=(const Date& d) { if ((*this < d) || (*this == d)) { return true; } else { return false; } } Date& Date::operator++() { int ret=GetMonthDay(*this); if (this->_day + 1 > ret) { this->_day = 1; this->_month += 1; if (this->_month > 12) { this->_month = 1; this->_year += 1; } return *this; } else { this->_day += 1; return *this; } } Date Date::operator++(int) { Date tmp(*this); int ret = GetMonthDay(*this); if (this->_day + 1 > ret) { this->_day = 1; if ((this->_month += 1) > 12) { this->_month = 1; this->_year += 1; } } else { this->_day += 1; } return tmp; } Date& Date::operator--() { int ret = GetMonthDay(*this); if ((this->_month == 1) && (this->_day == 1)) //1月1号 { this->_day = 31; this->_month = 12; this->_year -= 1; } else if (this->_day == 1) //除12月的某个月的1号 { Date tmp = GetUpMonthDay(*this); this->_day = GetMonthDay(tmp); } else { this->_day -= 1; } return *this; } Date Date::operator--(int) //不对 { Date tmp(*this); --(*this); return tmp; } //日期+天数 Date& Date::operator+(int day) { int i; for (i = day; i > 0; i--) { ++(*this); } return *this; } //日期-天数 Date& Date::operator-(int day) { int i; for (i = day; i > 0; i--) { --(*this); } return *this; } // //日期-日期 int Date::operator-(Date& d) { int count = 0; while (*this != d) { count++; if (*this > d) { d++; } else { (*this)++; } } return count; } //测试是个默认成员函数的重载 void test1() { Date d1(2000, 4, 5); Date d2(1994, 10, 24); Date d3=d1; d1 = d2; cout << d1 << endl; cout << d2 << endl; cout << d3 << endl; cout << d1.isLeapYear(d1) << endl; } //比较两个日期的是否相等 void test2() { Date d1(1994, 4, 5); Date d2(1994, 10, 24); Date d3(1994, 4, 5); if (d1 != d2) { cout << "1" << endl; } else { cout << "0" << endl; } } //比较日期的大小 void test3() { Date d1(1994, 4, 5); Date d2(1994, 4, 6); Date d3(1995, 4, 6); Date d4(1995, 5, 6); if (d2 < d1) { cout << "1" << endl; } else { cout << "0" << endl; } } //时间自增自减 void test4() { Date tmp(0, 0, 0); Date d1(2001, 1, 2); tmp=++d1; //++d1; //tmp=d1++; //这块有错误 //--d1; //Date tmp=d1--; cout << d1 << endl; cout << tmp << endl; } void test5() { Date d1(2017, 7, 10); Date d2(2016, 6, 3); int ret = d2 - d1; cout << ret << endl; // d1 - 95; // cout << d1 << endl; // d1.GetUpMonthDay(d1); // d1.GetNextMonthDay(d1); // cout << d1 << endl; } int main() { //test1(); //test2(); //test3(); //test4(); test5(); return 0; }