【C++】日期类实现 日期类实现1、关系运算符重载、、、、、!如果判断a是否大于b可以先写判断a小于b和a等于b的函数其他的复用主要框架(.h文件)#pragmaonce#includeassert.h#includeiostreamusing namespace std;class Date{public:// 友元函数声明friend ostreamoperator(ostreamout,constDated);friend istreamoperator(istreamin,Dated);intGetMonthDay(intyear,intmonth){assert(month0month13);staticintmonthDayArray[13]{-1,31,28,31,30,31,30,31,31,30,31,30,31};if(month2((year%40year%100!0)||(year%4000)))return29;elsereturnmonthDayArray[month];}// 只要不改变调用对象的函数都建议加constvoidPrint()const;boolCheckDate();Date(intyear1,intmonth1,intday1);Dateoperator(intday);Date operator(intday)const;Dateoperator-(intday);Date operator-(intday)const;// d1; - d1.operatpr();Dateoperator();//d1; - d1.operatpr(1);Date operator(int);// --d1;Dateoperator--();//d1;Date operator--(int);bool operator(constDated)const;bool operator!(constDated)const;bool operator(constDated)const;bool operator(constDated)const;bool operator(constDated)const;bool operator(constDated)const;// 日期-日期 难intoperator-(constDated)const;/*ostream operator(ostream out) { out _year 年 _month 月 _day 日 endl; return out; }*/Date*operator(){returnthis;// return nullptr;}constDate*operator()const{returnthis;// return nullptr;}private:int_year;int_month;int_day;};ostreamoperator(ostreamout,constDated);istreamoperator(istreamin,Dated);1.重载bool Date::operator(constDated)const{if(_yeard._year){returntrue;}elseif(_yeard._year){if(_monthd._month){returntrue;}elseif(_monthd._month){return_dayd._day;}}returnfalse;}2.重载bool Date::operator(constDated)const{return_yeard._year_monthd._month_dayd._day;}3.重载bool Date::operator(constDated)const{return*thisd||*thisd;}4.重载bool Date::operator(constDated)const{return!(*thisd);}5.重载bool Date::operator(constDated)const{return!(*thisd);}6.重载!bool Date::operator!(constDated)const{return!(*thisd);}2、赋值运算符重载1.获取某个月的天数重载和时涉及日期进位当日期为这个月的最后一天时再加一天月份要进一位intGetMonthDay(intyear,intmonth){assert(month0month13);staticintmonthDayArray[13]{-1,31,28,31,30,31,30,31,31,30,31,30,31};if(month2((year%40year%100!0)||(year%4000)))return29;elsereturnmonthDayArray[month];}设置一个数组存放每个月的天数以月份为下标把数组设置为静态因为函数会被调用多次设置成静态第一次创建之后一直到程序结束后还在可以避免函数调用时重复的创建数组当月份为2时要判断是否是闰年2.重载用于给出一个已知日期计算过了若干天后的日期DateDate::operator(intday)//这里必须是 d1100是错误的 d1没改变{if(day0){return*this--day;}_dayday;while(_dayGetMonthDay(_year,_month)){_day-GetMonthDay(_year,_month);_month;if(_month13){_year;_month1;}}return*this;}3.重载和的方法类似可以利用实现重载Date Date::operator(intday)const{Date tmp*this;tmpday;returntmp;}4.重载-DateDate::operator-(intday){if(day0){return*this-day;}_day-day;while(_day0){--_month;if(_month0){_month12;_year--;}// 借上⼀个⽉的天数_dayGetMonthDay(_year,_month);}return*this;//第二种写法//*this*this-day;//return *this;//拷贝次数多}5.重载日期-天数利用-重载-Date Date::operator-(intday)const{Date tmp*this;tmp-day;returntmp;}6.重载日期-日期intDate::operator-(constDated)const{Date max*this;//存放大日期Date mind;//存放小日期intflag1;if(*thisd){maxd;min*this;flag-1;}//初始化计数器intn0;while(min!max){min;n;}returnn*flag;}flag为标记符号默认*this日期≥d日期结果为正调用Date类重载的运算符判断当前日期(this)是否小于d若成立说明d是大日期*this是小日期执行大括号内逻辑把大日期d赋值给max把小日期*this赋值给minfalg更新符号为-1最终结果取负退出if语句初始化一个计数器统计从min到max之间的天数差最终返回值若*this≥d结果为正flag1返回n若*thisd结果为负flag-1返回-n3、重载、–1.重载前置DateDate::operator(){*this1;//先把自己加一天return*this;//加完之后的样子}返回之后的值2.重载后置Date Date::operator(int){Datetmp(*this);//保存自己当前的样子*this1;//把自己加一天returntmp;//返回保存下来的自己}返回之前的值3.重载前置–DateDate::operator--(){*this-1;return*this;}返回–之后的值4.重载后置–Date Date::operator--(int){Date tmp*this;*this-1;returntmp;}返回–之前的值4、重载、对于自定义类型编译器不知道如何打印所以通过打印日期类对象cin是istream类实例化对象cout是ostream类实例化对象将重载成全局函数ostreamoperator(ostreamout,constDated){outd._year年d._month⽉d._day⽇endl;returnout;}注意因为该运算符重载函数写在全局默认函数内部无法访问日期类的私有成员变量所以把该函数设置成友元函数friend ostreamoperator(ostreamout,constDated);将重载成全局函数istreamoperator(istreamin,Dated){cout请依次输入年⽉日:;ind._yeard._monthd._day;if(!d.CheckDate()){cout⽇期非法endl;}returnin;}注意两个参数都不能加const修饰friend istreamoperator(istreamin,Dated);如果文章中有错误或不足欢迎大家指正交流。