/****************************************************************************************** date.hpp: Copyright (c) Bit Software, Inc.(2013), All rights reserved. Purpose: 声明并实现一个日期类 难度:*** Author: xxx Created Time: 2015-4-26 ******************************************************************************************/ #ifndef DATE_HPP_INCLUDED #define DATE_HPP_INCLUDED #include <iostream> using namespace std; class Date { public: Date (int year = 1, int month = 1, int day = 1) :_year(year) ,_month(month) ,_day(day) { // 检查如果输入参数是非法时间,则初始化为1990-1-1 if (check_is_valid_date () == false) { year = 1990; month = 1; day = 1; } } Date (const Date& d) :_year(d._year) ,_month(d._month) ,_day(d._day) {} // 思考为什么operator=赋值函数需要一个date&的返回值?? Date& operator= (const Date& d) { if (this != &d) { this->_year = d._year; this->_month = d._month; this->_day = d._day; } return *this; } ~Date() {} // 检查时间是否有效 bool check_is_valid_date () { if (_year < 1 || (_month < 1 || _month > 12) || (_day < 1 || _day > day_of_month (_year, _month))) { return false; } return true; } void display () { cout<<_year<<"-"<<_month<<"-"<<_day<<endl<<endl; } public: // static修饰成员函数是静态成员函数,不明白的查一下资料! // 返回一个月的天数,日期非法则返回0 // 这个函数这是一种优化的思路,你还有其他的逻辑思路吗?请实现! static int day_of_month (int year, int month) { if (year < 1 || month < 1 || month > 12) { return 0; } int month_days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 瑞年的2月是29天 month_days[2] += is_leap_year(year); return month_days[month]; } // 判断是否为瑞年。 // 另外请思考为什么瑞年是这样计算,而不直接是year % 4 == 0就是瑞年??? static bool is_leap_year (int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return true; } return false; } // 请实现下面的运算符重载 public: // 计算日期 +/- 一定天数以后的日期 Date operator+(int day) { if( (_day+day) > day_of_month(_year,_month) ) { _month = _month+1; _day = day - (day_of_month(_year,_month) - _day) + 1; if(_day == 0) { _day += 1; } cout<<"month = "<<_month<<"day = "<<_day<<endl; } else { _day=_day+day; cout<<"month = "<<_month<<"day = "<<_day<<endl; } return Date(_year,_month,_day); } Date& operator+=(int day) { if( (_day+day) > day_of_month(_year,_month) ) { _month = _month+1; _day = day - (day_of_month(_year,_month) - _day) + 1; if(_day == 0) { _day += 1; } cout<<"month = "<<_month<<"day = "<<_day<<endl; } else { _day=_day+day; cout<<"month = "<<_month<<"day = "<<_day<<endl; } return *this; } Date operator-(int day) { if( (_day-day) <= 0 ) { _month = _month-1; if(_month == 0) { _month = 12; } if(_day == 0) { _day = day_of_month(_year,_month); } _day=_day-day; _day = day_of_month(_year,_month) + _day; cout<<"month = "<<_month<<"day = "<<_day<<endl; } else { _day=_day-day; cout<<"month = "<<_month<<"day = "<<_day<<endl; } return Date(_year,_month,_day); } Date& operator-=(int day) { if( (_day-day) <= 0 ) { _month = _month-1; if(_month == 0) { _month = 12; } if(_day == 0) { _day = day_of_month(_year,_month); } _day=_day-day; _day = day_of_month(_year,_month) + _day; cout<<"month = "<<_month<<"day = "<<_day<<endl; } else { _day=_day-day; cout<<"month = "<<_month<<"day = "<<_day<<endl; } return *this; } // 另外日期 + 日期没有意义? //没有意义 // 计算日期 - 日期以后的天数。 int operator-(const Date& d) { int i = 0; int j = 0; int value; for(;_year<0;_year--) { if(is_leap_year(_year) == true) { i +=_year * 366; } else { i +=_year * 365; } } int tmp = d._year; for(;tmp<0;tmp--) { if(is_leap_year(tmp) == true) { j += tmp * 366; } else { j += tmp * 365; } } int p = _month; while(p) { i += day_of_month(_year,_month); p--; } int q = d._month; while(q) { j += day_of_month(tmp,d._month); q--; } i += _day; j += d._day; value = i - j; if(value < 0) { value=-value; } cout<<"相差天数"<<value<<endl; return value; } Date operator++() { ++_day; if(_day > day_of_month(_year,_month)) { _day = 1; _month++; if(_month > 12) { _year++; _month = 1; } } } Date& operator++(int) // 后置++ { _day++; if(_day > day_of_month(_year,_month)) { _day = 1; _month++; if(_month > 12) { _year++; _month = 1; } } return *this; } Date operator--() { --_day; if(_day < 1) { _month--; _day=day_of_month(_year,_month); if(_month < 1) { _year--; _month = 12; } } } Date& operator--(int) // 后置-- { _day--; if(_day < 1) { _month--; _day=day_of_month(_year,_month); if(_month < 1) { _year--; _month = 12; } } return *this; } bool operator > (const Date& d) { if(_year > d._year) { cout<<"True\n"; return true; } else { if(_month > d._month) { cout<<"True\n"<<endl; return true; } else { if(_day > d._day) { cout<<"True"<<endl; return true; } else { cout<<"Falese\n"<<endl; return false; } } } cout<<"false\n"; return false; } bool operator >= (const Date& d) { if(_year > d._year) { cout<<"True\n"; return true; } else if(_year < d._year) { cout<<"False"<<endl; return false; } else { if(_month > d._month) { cout<<"True\n"<<endl; return true; } else if(_month < d._month) { cout<<"False\n"<<endl; return false; } else { if(_day > d._day) { cout<<"True"<<endl; return true; } else if(_day < d._day) { cout<<"False\n"<<endl; return false; } else { cout<<"Falese\n"<<endl; return false; } } } cout<<"false\n"; return false; } bool operator < (const Date& d) { if(_year < d._year) { cout<<"True\n"; return true; } else { if(_month < d._month) { cout<<"True\n"<<endl; return true; } else { if(_day < d._day) { cout<<"True"<<endl; return true; } else { cout<<"Falese\n"<<endl; return false; } } } cout<<"false\n"; return false; } bool operator <= (const Date& d) { if(_year < d._year) { cout<<"True\n"; return true; } else if(_year > d._year) { cout<<"False"<<endl; return false; } else { if(_month < d._month) { cout<<"True\n"<<endl; return true; } else if(_month > d._month) { cout<<"False\n"<<endl; return false; } else { if(_day < d._day) { cout<<"True"<<endl; return true; } else if(_day > d._day) { cout<<"False\n"<<endl; return false; } else { cout<<"False\n"<<endl; return false; } } } cout<<"False\n"; return false; } bool operator == (const Date& d) { if(_day == d._day && _month ==d._month && _year == d._year) { return true; } else { return false; } } bool operator != (const Date& d) { if(_day == d._day && _month ==d._month && _year == d._year) { cout<<"False"<<endl; return false; } else { cout<<"True"<<endl; return true; } } private: int _year; int _month; int _day; }; void test_date1 () { // 正常日期测试 Date d1(2015, 4, 26); d1.display (); // 非法日期测试 Date d2(2015, 2, 30); d2.display (); Date d3(d1); d3.display(); d3 = d2; d3.display (); int year = 2000; if (Date::is_leap_year (year)) { cout<<year<<" is leap year"<<endl; } else { cout<<year<<" is not leap year"<<endl; } int month = 5; cout<<"day of "<<month<<" month:"<<Date::day_of_month(year, month)<<endl<<endl; year = 1999; if (Date::is_leap_year (year)) { cout<<year<<" is leap year"<<endl; } else { cout<<year<<" is not leap year"<<endl; } cout<<"day of "<<month<<" month:"<<Date::day_of_month(year, month)<<endl<<endl; } #endif // DATE_HPP_INCLUDED
原文地址:http://blog.csdn.net/zhongqi0808/article/details/45621289