经过前面的两篇博客,我们已经可以粗略的使用《构造函数》,《析构函数》,《拷贝构造函数》以及《赋值运算符的重载》来实现一个时间类的<<增,删>>,《比较大小两个日期的大小》,《一个日期减一个日期得到一个新的日期》,《一个日期减一个天数的大小》,《一个日期加一个天数》等等的简单实现,现在就来看一看下,这是在c++里面实现的。
首先,如果感觉自己能力比较强的同学,可以自己去实现一下,我先把日期类 《接口》给大家,看下面一段的代码;
#include"iostream"//(我这里面不能显示"<>"这个符号)
using namespace std;
class Date
{
public:
int GetMonthDay(int year, int month)
{
int monthArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
if (month == 2 && ) //在这里还要判断是否为瑞年,
return 29;
else
return monthArray[month];
}
// 四个成员函数
Date(int year = 2019, int month = 1, int day = 1)
{
if (year > 0 &&
month > 0 && month < 13 &&
day > 0 && day <= GetMonthDay(year, month))
{
_year = year;
_month = month;
_day = day;
}
else
{
cout << "日期非法" << endl;
}
}
//实现两个日期的一下接口,看是否相等,一个日期是否比另外一个大,等等!!!;
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);
//给定一个日期(加,减)加一个天数;
Date operator+(int day);
Date operator+=(int day);
Date operator-(int day);
Date operator-=(int day);
// 给定一个日期实现前置(++,--);
Date operator++();
Date operator--();
// 给定一个日期实现后置(++,--);
Date operator++(int);
Date operator--(int);
//一个日期减一个日期,
int operator-(const Date& d);
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2019, 2, 29);
d1.Print();
return 0;
}
接下来就看看我实现的代码:
//#include<iostream>
//using namespace std;
//
//class Date
//{
//public:
// int GetMonthDay(int year, int month)
// {
// int monthArray[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;
// else
// return monthArray[month];
// }
// // 四个成员函数
// Date(int year = 2019, int month = 1, int day = 31)
// {
// if (year > 0 &&
// month > 0 && month < 13 &&
// day > 0 && day <= GetMonthDay(year, month))
// {
// _year = year;
// _month = month;
// _day = day;
// }
// else
// {
// cout << "日期非法" << endl;
// }
// }
// bool operator==(const Date& d)
// {
// return _year == d._year
// && _month == d._month
// && _day == d._day;
// }
// 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;
// }
// if(_year < d._year)
// {
// return false;
// }
// if(_month > d._month )
// {
// return true;
// }
// if(_month < d._month )
// {
// return false;
// }
// if(_day > d._day)
// {
// return true;
// }
// if(_day <= d._day)
// {
// return false;
// }
// }
// bool operator<(const Date& d) //判断一个日期是否小于另外一个;
// {
// if(_year < d._year)
// {
// return true;
// }
// if(_year > d._year)
// {
// return false;
// }
// if(_month < d._month )
// {
// return true;
// }
// if(_month > d._month )
// {
// return false;
// }
// if(_day < d._day)
// {
// return true;
// }
// if(_day >= d._day)
// {
// return false;
// }
// }
// bool operator>=(const Date& d)
// {
// if(_year > d._year)
// {
// return true;
// }
// if(_year < d._year)
// {
// return false;
// }
// if(_month > d._month )
// {
// return true;
// }
// if(_month < d._month )
// {
// return false;
// }
// if(_day > d._day)
// {
// return true;
// }
// if(_day < d._day)
// {
// return false;
// }
// else
// return true;
//}
// bool operator<=(const Date& d)
// {
// if(_year < d._year)
// {
// return true;
// }
// if(_year > d._year)
// {
// return false;
// }
// if(_month < d._month )
// {
// return true;
// }
// if(_month > d._month )
// {
// return false;
// }
// if(_day < d._day)
// {
// return true;
// }
// if(_day > d._day)
// {
// return false;
// }
// else
// return true;
// }
// Date operator+(int day) //一个日期加上一个天数;
// {
// Date fur((*this));
// fur._day+=day;
// while(fur._day > GetMonthDay(fur._year,fur._month))
// {
// if(fur._month!=12)
// {
// fur._day = fur._day - GetMonthDay(fur._year,fur._month);
// fur._month++;
// }
// else
// {
// fur._day = fur._day-GetMonthDay(fur._year,12);
// fur._year++;
// fur._month = 1;
// }
// }
// return fur;
//}
// Date operator+=(int day) //一个日期加上一个固定天数;
// {
// _day += day;
// while(_day>GetMonthDay(_year,_month))
// {
// if(_month!=12)
// {
// _day = _day - GetMonthDay(_year,_month);
// _month++;
// }
// else
// {
// _day = _day-GetMonthDay(_year,12);
// _year++;
// _month = 1;
// }
// return (*this);
// }
//}
// Date operator-(int day) //一个日期减上一个天数;
// {
// Date fur((*this));
// fur._day-=day;
// while(fur._day <= 0)
// {
//
// if(fur._month == 1)
// {
// fur._day = fur._day + GetMonthDay(fur._year,12);
// fur._month = 12;
// fur._year--;
// }
// else
// {
// fur._month -= 1;
// fur._day = fur._day + GetMonthDay(fur._year,fur._month);
// }
// }
// return fur;
//}
// Date operator-=(int day) //一个日期减上一个固定天数;
// {
// _day -= day;
// while(_day <= 0)
// {
//
// if(_month == 1)
// {
// _day = _day + GetMonthDay(_year,12);
// _month = 12;
// _year--;
// }
// else
// {
// _month -= 1;
// _day = _day + GetMonthDay(_year,_month);
// }
// }
// return (*this);
//}
// Date& operator++() //前置++
// {
// (*this) += 1;
// return (*this);
// }
// Date operator--() //前置--
// {
// (*this) -= 1;
// return (*this);
// }
// Date operator++(int) //后置++
// {
// Date copy(*this);
// (*this) += 1;
// return copy;
// }
// Date operator--(int) //后置--
// {
// Date copy(*this);
// (*this) -= 1;
// return copy;
// }
//int operator-(const Date& d) //一个日期减上一个日期;
//{
// int count = 0;
// Date copy(*this);
// if(copy<d)
// {
// while(copy!=d)
// {
// copy++;
// count--;
// }
// return count;
// }
// if(copy==d)
// {
// return 0;
// }
// if(copy>d)
// {
// while(copy!=d)
// {
// copy--;
// count++;
// }
// return count;
// }
//}
// void Print()
// {
// cout << _year << "-" << _month << "-" << _day << endl;
// }
//private:
// int _year;
// int _month;
// int _day;
//};
//int main()
//{
// /*Date d1(2019, 1 ,30);
// d1.Print();*/
// Date d;
// d.Print();
// Date d1(2018,1,25);
// d1.Print();
// (d1+8).Print();
// //d++;
// //d = (d-31);
// //d.Print();
// //d.operator -= (1);
// //--d;
// /* d.Print();*/
//
// //cout<<(d1 <= d)<<endl;
//
// return 0;
//}
(因为当时的需要,我把代码屏蔽了)在这里,我是每一个都实现了出来,大家是否感觉代码量非常的大,而且感觉很重复,那有没有什么简单方法,来减少我们的代码量?
答:那是肯定有的,我们想一想,如果我们在判断两个日期日期是否相等的时候,只实现 “<” 和 “==” 那么是不是其他运算符可以使用这两个来调用?比如举两个例子:我们现在要求比较两个日期的不相等,那么我们是否可以用《return !((*this) == d加粗样式)**》来使用,或者是比较一个日期是否大于等于另外一个日期,可以用《return !((*this) < d)》,来直接比较。
那么下来就看一下,我简化之后代码:
#include<iostream>
#include<assert.h>
using namespace std;
class Date
{
public:
bool GetYear( int year)
{
assert(year);
if((year%4 == 0 && year%100 != 0)
|| year%400 == 0)
{
return true;
}
else
{
return false;
}
}
int GetMonthDay(int year, int month)
{
const int monthArray[13] = { 0, 31, 28, 31, 30, 31, 30 ,31, 31, 30, 31,30, 31 };
if (month == 2 && GetYear(year))
return 29;
else
return monthArray[month];
}
// 四个成员函数
Date(int year = 2019, int month = 1, int day = 1)
{
if (year > 0 &&
month > 0 && month < 13 &&
day > 0 && day <= GetMonthDay(year, month))
{
_year = year;
_month = month;
_day = day;
}
else
{
cout << "日期非法" << endl;
}
}
bool operator==(const Date& d) //日期的相等
{
return _year == d._year
&& _month == d._month
&& _day == d._day ;
}
bool operator!=(const Date& d)
{
return !((*this) == d);
}
bool operator>(const Date& d)
{
return !((*this) < d && (*this) == d);
}
bool operator<(const Date& d)
{
if(_year < d._year )
{
return true;
}
if(_year > d._year )
{
return false;
}
if(_month < d._month )
{
return true;
}
if(_month > d._month )
{
return false;
}
if(_day < d._day )
{
return true;
}
if(_day >= d._day )
{
return false;
}
}
bool operator>=(const Date& d)
{
return !((*this) < d);
}
bool operator<=(const Date& d)
{
return !((*this) > d);
}
Date operator+(int day) //一个日期加上一个天数
{
Date fur(*this);
fur._day += day;
while(fur._day > GetMonthDay(fur._year, fur._month))
{
if(fur._month !=12 )
{
fur._day = fur._day - GetMonthDay(fur._year, fur._month);
fur._month++;
}
else
{
fur._day = fur._day - GetMonthDay(fur._year, fur._month);
fur._year++;
fur._month = 1;
}
}
return fur;
}
Date operator+=(int day) //一个日期加等上一个固定天数
{
_day += day;
while(_day > GetMonthDay(_year,_month))
{
if(_month !=12 )
{
_day = _day - GetMonthDay(_year,_month);
_month++;
}
else
_day = _day - GetMonthDay(_year, _month);
_year++;
_month = 1;
}
return (*this);
}
Date operator-(int day)//一个日期减上一个天数
{
Date fur(*this);
fur._day -= day;
while(fur._day < 1)
{
if(fur._month != 1)
{
fur._day = fur._day + GetMonthDay(fur._year, fur._month);
fur._month--;
}
else
{
fur._day = fur._day + GetMonthDay(fur._year, fur._month);
fur._year -= 1;
fur._month =12;
}
}
return fur;
}
Date operator-=(int day)//一个日期减等一个固定的天数
{
_day -= day;
while(_day < 1)
{
if(_month != 1)
{
_month--;
_day = _day + GetMonthDay(_year, _month);
}
else
{
_year -= 1;
_month =12;
_day = _day + GetMonthDay(_year, _month);
}
}
return (*this);
}
Date operator++() 前置++
{
(*this)++;
return (*this);
}
Date operator--() //前置--
{
(*this)--;
return (*this);
}
Date operator++(int) // 后置++
{
Date copy(*this);
(*this)++;
return copy;
}
Date operator--(int) 后置--
{
Date copy(*this);
(*this)--;
return copy;
}
int operator-(const Date& d) //一个日期减上一个日期
{
int count =0;
Date copy(*this);
if(copy > d)
{
copy--;
count++;
}
if(copy == d)
{
return 0;
}
if(copy < d)
{
copy++;
count--;
}
}
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
void Test1()
{
//Date d;
//d.Print();
//Date d1(2019, 1, 3);
// d1.Print();
//cout<<(d <= d1)<<endl;
/*Date d;
d.Print();*/
Date d1(2018,12,31);
d1.Print();
(d1+1).Print();
}
int main()
{
Test1();
return 0;
}
这样就可以简化我们一部分的代码量,我知道我这个还不是很好。如果有更好的意见,希望你们能够给我提一提,希望和大家共同进步,相互交流。