//這篇代碼比較長建議粘貼下來到dev裡面用左邊的+-把部分函數收起來一條條的打開看 不容易亂
#include <iostream>
using namespace std;
class Date{
private:
int year,month,day;//年月日
bool IsLeapYear()//判斷閏年
{
return (year%4==0&&year%100!=0)||(year%400==0);
}
public:
Date operator ++(); //前置單目運算符重載為成員函數
Date operator ++(int); //後置單目運算符重載為成員函數
void ShowMe()//輸出
{
cout<<year<<"-"<<month<<"-"<<day<<endl;
}
Date(int y=0,int m=0,int d=0)//帶預設參數的構造函數(無參和有參合二為一)
{
year=y;
month=m;
day=d;
}
};
Date Date::operator ++() //前置單目運算符重載為成員函數
{
Date x;//先定義一個Date類的以用于傳回
if(month==2)//先從月份進行判斷 這個if、else if、else 是并列關系
{
if(IsLeapYear()==1)
{//如果是閏月
if(day==29)
{//當起始日期為29 就要進月并把日傳回1
day=1;
month++;
}
else day++;//否則正常日+1
}
else
{//這裡和判斷閏年是并列的
if(day==28)
{
day=1;
month++;
}
else day++;
}
}
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{ //然後收起2月的判斷展開1357的
if(month==12)
{//這裡要注意 12月要單獨讨論 因為可能會進年+1
if(day==31)
{
day=1;
month=1;
year++;
}
else day++;
}
else
{//其他月份 1357
if(day==31)
{
day=1;
month++;
}
else day++;
}
}
else
{//合上1357打開2468 這個沒什麼好說的了
if(day==30)
{
day=1;
month++;
}
else day++;
}
x.year=year;//由于這個是前置的那就是說先+ 1後等值是以這裡兩個數相等
x.month=month;
x.day=day;
return x;
}
Date Date::operator ++(int)//後置單目運算符重載為成員函數
{//這裡可以直接從上面粘下來判斷,不過要記住先等值後+1,也就是說x記錄了第一個date 然後date自己+1
Date x;
x.year=year;
x.month=month;
x.day=day;
if(month==2)
{
if(IsLeapYear()==1)
{
if(day==29)
{
day=1;
month++;
}
else day++;
}
else
{
if(day==28)
{
day=1;
month++;
}
else day++;
}
}
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(month==12)
{
if(day==31)
{
day=1;
month=1;
year++;
}
else day++;
}
else
{
if(day==31)
{
day=1;
month++;
}
else day++;
}
}
else
{
if(day==30)
{
day=1;
month++;
}
else day++;
}
return x;
}
int main()
{
int a,b,c;
cin>>a>>b>>c;
Date x(a,b,c),y;
x.ShowMe();
y=x++;
x.ShowMe();
y.ShowMe();
y=++x;
x.ShowMe();
y.ShowMe();
return 0;
}