
1.非法日期输入的判断//日期类的实现classDate{public:intget_Month_day(intyear,intmonth){staticintMonth[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};//平年365天二月28天闰年366天二月29天if(month2((year%40year%100!0)||year%4000)){//闰年的话return29;}returnMonth[month];}Date(intyear0,intmonth1,intday1){//先对输入的参数做判断看是否符合常规if(year0month0month13day1dayget_Month_day(year,month)){_yearyear;_monthmonth;_dayday;}else{cout非法输入endl;}}voidPrint(){cout_year-_month-_dayendl;}private:int_year;int_month;int_day;};intmain(){Dated1;d1.Print();Dated2(2024,13,52);d2.Print();return0;}2.运算符重载逻辑运算符重载//日期类的实现classDate{public:intget_Month_day(intyear,intmonth){staticintMonth[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};//平年365天二月28天闰年366天二月29天if(month2((year%40year%100!0)||year%4000)){//闰年的话return29;}returnMonth[month];}Date(intyear0,intmonth1,intday1){//先对输入的参数做判断看是否符合常规if(year0month0month13day1dayget_Month_day(year,month)){_yearyear;_monthmonth;_dayday;}else{cout非法输入endl;}}voidPrint(){cout_year-_month-_dayendl;}//运算符的重载//d1 d2//d1.operator(d1, d2);this 表示d1bool operator(constDated){//编译器处理为 bool operator(Date* this, const Date d)if(_yeard._year){returntrue;}elseif(_yeard._year_monthd._month){returntrue;}elseif(_yeard._year_monthd._month_dayd._day){returntrue;}returnfalse;}//d1 d2bool operator(constDated){return_yeard._year_monthd._month_dayd._day;}//d1 d2bool operator(constDated){return*thisd||*thisd;}//d1 d2bool operator(constDated){return!(*thisd);}//d1 d2bool operator(constDated){return!(*thisd);}//d1 ! d2bool operator!(constDated){return!(*thisd);}private:int_year;int_month;int_day;};intmain(){Dated1(2024,5,6);Dated2(2024,12,2);cout(d1d2)endl;cout(d1d2)endl;cout(d1d2)endl;cout(d1d2)endl;cout(d1d2)endl;cout(d1!d2)endl;return0;}赋值运算符重载//赋值运算符重载//日期类的实现classDate{public:intget_Month_day(intyear,intmonth){staticintMonth[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};//平年365天二月28天闰年366天二月29天if(month2((year%40year%100!0)||year%4000)){//闰年的话return29;}returnMonth[month];}Date(intyear0,intmonth1,intday1){//先对输入的参数做判断看是否符合常规if(year0month0month13day1dayget_Month_day(year,month)){_yearyear;_monthmonth;_dayday;}else{cout非法输入endl;}}//d1 10Dateoperator(intday){Dateret(*this);//d1拷贝构造一个ret保持d1不变ret._dayday;//用ret做计算d1就不变//进位while(ret._dayget_Month_day(ret._year,ret._month)){//往月进位ret._day-get_Month_day(ret._year,ret._month);ret._month;//如果月进满了往年进位if(ret._month13){ret._year;ret._month1;}}returnret;}//写成复用情况/*Date operator(int day) { Date ret(*this); ret day; return ret; }*///d1 10Dateoperator(intday){//引用返回减少一次拷贝构造if(day0){return*this--day;}_dayday;//进位while(_dayget_Month_day(_year,_month)){//往月进位_day-get_Month_day(_year,_month);_month;//如果月进满了往年进位if(_month13){_year;_month1;}}return*this;}//d1 - 10Dateoperator-(intday){Dateret(*this);//d1拷贝构造一个ret保持d1不变ret._day-day;//处理借位while(ret._day0){//向月借位ret._month--;if(ret._month0){//向年借位if(ret._year0){//年没有位数可借日期置为0,然后返回ret._year0;ret._month0;ret._day0;returnret;}ret._year--;ret._month12;}ret._dayget_Month_day(ret._year,ret._month);}returnret;}////写成复用情况//Date operator-(int day) {// Date ret *this;// ret - day;// return ret;//}//d1 - 10Dateoperator-(intday){if(day0){return*this-day;}_day-day;//借位while(_day0){//往月借位_month--;//借前一个月的天数if(_month0){//向年借位if(_year0){//年没有位数可借日期置为0_year0;_month0;_day0;return*this;}_year--;_month12;}_dayget_Month_day(_year,_month);}return*this;}//d1 - d1// operator(int) 永远是后置 绝对不能表示前置 括号里的 int 只是占位符不需要传值、没用、只是用来区分重载//d1Dateoperator(inti){Dateret(*this);*this1;//调用上面的函数returnret;//后置返回加之前的值}//d1Dateoperator()//前置传入随便一个参数构成重载{*this1;return*this;}//d1--Dateoperator--(inti){Dateret(*this);*this-1;returnret;//后置--返回减之前的值}//--d1Dateoperator--()//前置--传入随便一个值构成函数重载{*this-1;return*this;//前置--返回减之后的值}voidPrint(){cout_year-_month-_dayendl;}private:int_year;int_month;int_day;};intmain(){Dated1(2024,4,18);d1.Print();//2024-4-18Dated2d11000;d2.Print();//2027-1-13Dated3d2-1000;d3.Print();//2024-4-18d1100;d1.Print();//2024-7-27d1-100;d1.Print();//2024-4-18d2;d2.Print();//2027-1-14d2--;d2.Print();//2027-1-13return0;}