過載++運算子為成員函式(日期類函式設計也可以看一下 )
阿新 • • 發佈:2018-11-15
//這篇程式碼比較長建議貼上下來到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; }