1. 程式人生 > >過載++運算子為成員函式(日期類函式設計也可以看一下 )

過載++運算子為成員函式(日期類函式設計也可以看一下 )

//這篇程式碼比較長建議貼上下來到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;
}