//这篇代码比较长建议粘贴下来到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;
}
重载++运算符为成员函数(日期类函数设计也可以看一下 )
猜你喜欢
转载自blog.csdn.net/q767410241/article/details/83870588
今日推荐
周排行