一、完整代码
#include<iostream>
using namespace std;
class Date{
public:
//构造函数并初始化
Date(int year = 2018, int month = 1, int day = 1) {
_year = year;
_month = month;
_day = day;
}
//析构函数
~Date(){
}
//拷贝构造函数
Date(const Date& d){ //必须传引用,否则会出现无限递归
_year = d._year;
_month = d._month;
_day = d._day;
}
//赋值运算符重载
Date& operator=(const Date& d) {
if (this != &d) {
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
//判断是否为闰年
bool Leapyear(int year){
return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}
//获取某年某月的天数
int GetMonthDay(int year, int month){
static int GetMonthday[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (Leapyear(year) && month == 2)
{
return 29;
}
else
{
return GetMonthday[month];
}
}
//==运算符重载
bool operator==(const Date& d){
return _year == d._year
&& _month == d._month
&& _day == d._day;
}
//>运算符重载
bool operator>(const Date& d) {
if (_year > d._year){
return true;
}
else if (_year == d._year){
if (_month > d._month){
return true;
}
else if (_month == d._month){
if (_day > d._day){
return true;
}
}
}
return false;
}
//<运算符重载
bool operator<(const Date& d) {
return !(*this >= d);
}
//>=运算符重载
bool operator>=(const Date& d) {
return *this > d || *this == d;
}
//<=运算符重载
bool operator<=(const Date& d) {
return !(*this > d);
}
//!=运算符重载
bool operator!=(const Date& d){
return !(*this == d);
}
//日期+=天数
Date& operator+=(int day){
_day += day;
while (_day > GetMonthDay(_year, _month))
{
_day = _day - GetMonthDay(_year, _month);
_month += 1;
if (_month > 12)
{
++_year;
_month = 1;
}
}
return *this;
}
//日期-=天数
Date& operator-=(int day){
_day = _day - day;
while (_day < 1){
_month -= 1;
if (_month == 0){
_month = 12;
--_year;
}
_day += GetMonthDay(_year, _month);
}
return *this;
}
//日期+天数
Date operator+(int day) {
Date ret = *this;//拷贝this指针
return ret += day;
}
//日期-天数
Date operator-(int day){
Date ret = *this;
return ret -= day;
}
//前置++
Date& operator++(){
*this += 1;
return *this;
}
//后置++
Date operator++(int){
Date tmp = *this;//保存一份日期
*this += 1;
return tmp;//返回自增前的日期
}
//前置--
Date& operator--(){
*this -= 1;
return *this;
}
//后置--
Date operator--(int){
Date tmp = *this;
*this -= 1;
return tmp;
}
//日期-日期 返回天数
int operator-(const Date& d) {
//确定日期的大小
Date d1 = *this;
Date d2 = d;
if (*this < d){//日期比较
d1 = d;
d2 = *this;
}
int day = 0;
while (d1 != d2){
d2++;
day++;
}
return day;
}
void Print(){
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
void Test1() {
Date d1(2022, 10, 17);
Date d2(2022, 10, 18);
Date d3(2021, 10, 17);
cout << (d1 < d2) << endl;
cout << (d1 < d3) << endl;
cout << (d1 == d3) << endl;
cout << (d1 > d3) << endl;
}
void Test2() {
Date d1(2022, 10, 17);
Date d2(2022, 10, 1);
(d1 + 4).Print();//日期+天数
(d1 + 40).Print();
(d1 + 400).Print();
(d1 + 4000).Print();
(d1 + 40000).Print();
(d1 - 4).Print();//日期-天数
(d1 - 40).Print();
(d1 - 400).Print();
cout << d1 - d2 << endl;//日期-日期,返回天数
Date ret1 = ++d1; //前置++
Date ret2 = d1++; //后置++
Date ret3 = --d1;//前置--
Date ret4 = d1--;//后置--
}
int main() {
Test1();
Test2();
}
二、运行结果