题目:实现一个日期类,主要实现日期计算功能:
日期+天数=日期;
日期-天数=日期;
日期-日期=天数;
要实现该日期类,必须熟练掌握运算符重载的概念和实现方法。
以下是编写的一个日期类:
头文件:
#ifndef __DATE_H__ #define __DATE_H__ #include<iostream> using namespace std; class Date { public: Date(int year = 1900, int month = 1, int day = 1); Date(const Date& d); Date& operator=(const Date& d); int DaysOfMonth();//一个月的天数 bool IsInvalid();//判断非法输入 bool IsLeapYear();//判断闰年 void ToCorrectDate();//调整为正确的日期 Date& operator+=(int days); Date& operator-=(int days); friend ostream& operator<<(ostream& output, const Date& d);//输出运算符重载 friend bool operator>(const Date& d1, const Date& d2); friend bool operator>=(const Date& d1, const Date& d2); friend bool operator<=(const Date& d1, const Date& d2); friend bool operator<(const Date& d1, const Date& d2); friend bool operator==(const Date& d1, const Date& d2); friend bool operator!=(const Date& d1, const Date& d2); friend Date operator+(const Date& d, int days);//日期+天数 friend Date operator-(const Date& d, int days);//日期-天数 friend int operator-(const Date& d1, const Date& d2);//日期-日期 private: int _year; int _month; int _day; }; #endif
源文件:
Date::Date(int year, int month, int day)//构造函数 :_year(year) , _month(month) , _day(day) { if (IsInvalid())//若输入的日期不合法,则调整为合法日期 { _year = 1900; _month = 1; _day = 1; } } Date::Date(const Date& d)//拷贝构造函数 { _year = d._year; _month = d._month; _day = d._day; } Date& Date::operator=(const Date& d)//赋值运算符重载 { _year = d._year; _month = d._month; _day = d._day; return *this; } int Date::DaysOfMonth() { int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //用数组的形式表示每个月的天数 if (IsLeapYear())//若为闰年则二月份天数为29天 { days[2] += 1; } return days[_month]; } bool Date::IsInvalid() { if (_year < 1900 || _month < 0 || _month > 12 || _day < 0 || _day > DaysOfMonth()) return true; else return false; } bool Date::IsLeapYear() { return (_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0; } ostream& operator<<(ostream& output, const Date& d)//输出运算符重载 { output << d._year << "-" << d._month << "-" << d._day; return output; } bool operator==(const Date& d1, const Date& d2) { return (d1._year == d2._year) && (d1._month == d2._month) && (d1._day == d2._day); } bool operator!=(const Date& d1, const Date& d2) { return !(d1 == d2); } bool operator>(const Date& d1, const Date& d2) { if (d1._year > d2._year) return true; if (d1._year == d2._year) { if (d1._month > d2._month) return true; if (d1._month == d2._month) { if (d1._day > d2._day) { return true; } } } return false; } bool operator>=(const Date& d1, const Date& d2) { return (d1 > d2) || (d1 == d2); } bool operator<=(const Date& d1, const Date& d2) { return !(d1 > d2); } bool operator<(const Date& d1, const Date& d2) { return !(d1 >= d2); } void Date::ToCorrectDate() { while (_day <= 0) { if (_month == 1) { _month = 12; _year -= 1; } else _month--; _day += DaysOfMonth(); } while (_day > DaysOfMonth()) { _day -= DaysOfMonth(); if (_month == 12) { _month = 1; _year += 1; } else _month++; } } Date operator+(const Date& d, int days) { Date d1(d); d1._day += days; d1.ToCorrectDate(); return d1; } Date& Date::operator+=(int days) { _day += days; ToCorrectDate(); return *this; } Date operator-(const Date& d, int days) { Date d1(d); d1._day -= days; d1.ToCorrectDate(); return d1; } Date& Date::operator-=(int days) { _day -= days; ToCorrectDate(); return *this; } int operator-(const Date& d1, const Date& d2) { Date MinDate(d1); Date MaxDate(d2); int days = 0; if (d1 > d2) { MinDate = d2; MaxDate = d1; } if (d1 < d2) { MinDate = d1; MaxDate = d2; } while (MinDate != MaxDate)//较小的日期每次增加一天,直到与较大日期相等 { MinDate += 1; days++;//记录天数 } return days; }
测试文件:
#include"date.h" int main() { Date d1(2016, 1, 7); Date d2(2016,1,3); Date d; int days = 100; d = d1 + days; cout << d1 <<" + "<< days <<": "<< d << endl; d = d1 - days; cout << d1 << " - " << days << ": " << d << endl; days = d1 - d2; cout <<d1 <<" - "<< d2<<": "<<days<< endl; getchar(); return 0; }