1.头文件
定义了日期类,给出了类成员变量及成员函数的声明
#pragma once
#include<iostream>
#include<assert.h>
using namespace std;
class Date
{
public:
friend ostream& operator<<(ostream& out, const Date& d);
friend istream& operator>>(istream& in, Date& d);
//判断日期是否合法
void IsDayTrue()const;
// 获取某年某月的天数
static int GetMonthDay(int year, int month);
// 全缺省的构造函数
Date(int year = 1900, int month = 1, int day = 1) {
IsDayTrue();
_year = year;
_month = month;
_day = day;
}
// 拷贝构造函数
// d2(d1)
Date(const Date& d) {
_year = d._year;
_month = d._month;
_day = d._day;
}
//打印日期
void printf()const {
cout << _year << "-" << _month << "-" << _day << endl;
}
// 赋值运算符重载
// d2 = d3 -> d2.operator=(&d2, d3)
Date& operator=(const Date& d) {
if (this != &d) {
this->_year = d._year;
this->_month = d._month;
this->_day = d._day;
}
return *this;
}
// 析构函数
~Date() {
}
// 日期+=天数
Date& operator+=(int day);
// 日期+天数
Date operator+(int day)const;
// 日期-天数
Date operator-(int day)const;
// 日期-=天数
Date& operator-=(int day);
// 前置++
Date& operator++();
// 后置++
Date operator++(int)const;
// 后置--
Date operator--(int )const;
// 前置--
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;
private:
int _year;
int _month;
int _day;
};
//流插入,流提取
ostream& operator<<(ostream& out ,const Date& d);
istream& operator>>(istream& in, Date& d);
2.成员函数的定义
#include "date.h"
void Date::IsDayTrue()const {
if (_month > 0 && _month < 13 && _day>0 && _day <= GetMonthDay(_year, _month)) {
return;
}
else {
cout << "非法日期" << endl;
assert(false);
}
}
int Date::GetMonthDay(int year, int month) {
int _month[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;
}
return _month[month];
}
Date& Date::operator+=(int day) {
_day += day;
while (_day > GetMonthDay(_year, _month)) {
_day -= GetMonthDay(_year, _month);
_month++;
if (_month > 12) {
_year++;
_month = 1;
}
}
return *this;
}
Date Date::operator+(int day)const {
Date temp(*this);
temp += day;
return temp;
}
Date& Date::operator-=(int day) {
_day -= day;
while (_day < 0) {
_month--;
_day += GetMonthDay(_year, _month);
if (_month < 0) {
_year--;
_month = 1;
}
}
return *this;
}
Date Date::operator-(int day)const {
Date temp(*this);
temp -= day;
return temp;
}
Date& Date::operator++() {
*this += 1;
return *this;
}
Date Date::operator++(int )const {
Date temp(*this);
temp+=1;
return temp;
}
Date& Date::operator--() {
*this -= 1;
return *this;
}
Date Date::operator--(int) const{
Date temp(*this);
temp-=1;
return temp;
}
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 {
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);
}
bool Date::operator <= (const Date& d) const {
return !(*this > d);
}
bool Date::operator != (const Date& d) const {
return !(*this == d);
}
//int Date::operator-(const Date& d) {
//
// int days = 0;
// int month = _month;
// int year = _year;
//
// if (_day < d._day) {
//
// _day += GetMonthDay(_year, month);
// month--;
// }
//
// days = _day - d._day;
//
//
// if (month < d._month) {
//
// month += 12;
// year--;
// }
//
// int x = d._month;
//
// for (int i = d._month,y=d._year; i < month ; i++,x++) { //控制循环次数,即计算相差几个月
//
// if(x > 12) {
// x = 1;
// y++;
// }
// int ret=GetMonthDay(y,x);
// days += ret;
//
//
// }
//
// for (int i = d._year; i < year; i++) {
//
// if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
// days += 366;
// }
//
// else {
// days += 365;
// }
// }
//
// return days;
//}
//d1<d2,计算d1-d2
int Date::operator-(const Date& d)const
{
int flag = 1;
Date max = *this;
Date min = d;
if (*this < d)
{
max = d;
min = *this;
flag = -1;
}
int day = 0;
while (min < max)
{
++(min);
++day;
}
return day * flag;
}
ostream& operator<<(ostream& out, const Date& d) {
d.IsDayTrue();
out << d._year <<"年"<< d._month << "月" << d._day << "日" << endl;
return out;
}
istream& operator>>(istream& in, Date& d) {
in >> d._year >> d._month >> d._day;
d.IsDayTrue();
return in;
}