c++ 日期类 + - * / ++ -- 重载

#include
#include
using namespace std;

class Date
{
private:
int year,month,day;
public:
Date(int y=2015,int m=5,int d=20):year(y),month(m),day(d){}
Date(Date &a){year=a.year;month=a.month;day=a.day;}
int Gety(){return year;}
int Getm(){return month;}
int Getd(){return day;}
void Set(int y,int m,int d){year=y;month=m;day=d;}
Date operator +(int);
Date operator -(int);
Date operator ++(int);
Date operator --(int);
Date operator ++();
Date operator --();
int Tianshu(int i);
};

Date Date::operator ++()
{
day++;
if(day>Tianshu(month))
{
day=1;
month++;
if(month>12)
{
month=1;year++;
}
}
return *this;
}

Date Date::operator ++(int)
{
Date a;
a=*this;
day++;
if(day>Tianshu(month))
{
day=1;
month++;
if(month>12)
{
month=1;year++;
}
}
return a;
}

Date Date::operator --(int)
{
Date a;
a=*this;
day–;
if(day<1)
{
month–;
if(month<1)
{
month=12;
year–;
}
day=Tianshu(month);
}
return a;
}

Date Date::operator --()
{
day–;
if(day<1)
{
month–;
if(month<1)
{
month=12;
year–;
}
day=Tianshu(month);
}
return *this;
}

int Date::Tianshu(int i)
{
int d;
switch(i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
d=31;return d;
case 4:
case 6:
case 9:
case 11:
d=30;return d;
default:
{
if(year%40&&year%100!=0||year%4000)
{d=29;return d;}
else
{d=28;return d;}
}
}

}

Date Date::operator+(int i)
{
Date q(*this);
if(q.day+i>q.Tianshu(q.month))
{
i=i-(q.Tianshu(q.month)-q.day)-1;
q.day=1;
q.month++;
if(q.month>12)
{q.month=1;q.year++;}
}
while(q.day+i>q.Tianshu(q.month))
{
i=i-q.Tianshu(q.month);
q.month++;
if(q.month>12)
{q.month=1;q.year++;}
}
q.day=q.day+i;
return q;
}

Date Date::operator -(int i)
{
Date q(*this);
if(q.day-i<=0)
{
i-=q.day;
q.month–;
if(q.month<1)
{q.month=12;q.year–;}
q.day=Tianshu(q.month);
}
while(q.day-i<=0)
{
i=i-q.day;
q.month–;
if(q.month<1)
{q.month=12;q.year–;}
q.day=q.Tianshu(q.month);
}
q.day=q.day-i;
return q;
}

ostream & operator <<(ostream &out,Date &a)
{
cout<<a.Gety()<<“年”<<a.Getm()<<“月”<<a.Getd()<<“日”;
return out;
}

int main()
{
Date d1,d2(2008,8,8);
Date d3,d4;
int year1,month1,day1,year2,month2,day2,n;
cout<<“Date 1:”<<d1<<" Date 2:"<<d2<<endl;
while(cin>>year1>>month1>>day1>>year2>>month2>>day2)
{
d1.Set(year1,month1,day1); d2.Set(year2,month2,day2);
cout<<“Date 1:”<<d1<<" Date 2:"<<d2<<endl;
d3=–d1; d4=++d2;
cout<<“Date 1:”<<d1<<" Date 2:"<<d2<<endl;
cout<<“Date 3:”<<d3<<" Date 4:"<<d4<<endl;
cin>>year1>>month1>>day1>>year2>>month2>>day2;
d1.Set(year1,month1,day1); d2.Set(year2,month2,day2);
d3=d1–; d4=d2++;
cout<<“Date 1:”<<d1<<" Date 2:"<<d2<<endl;
cout<<“Date 3:”<<d3<<" Date 4:"<<d4<<endl;
cin>>n;
d3=d1+n; d4=d2-n;
cout<<“Date 1:”<<d1<<" Date 2:"<<d2<<endl;
cout<<“Date 3:”<<d3<<" Date 4:"<<d4<<endl;
cin>>n;
d3=d1+n; d4=d2-n;
cout<<“Date 1:”<<d1<<" Date 2:"<<d2<<endl;
cout<<“Date 3:”<<d3<<" Date 4:"<<d4<<endl;
}
return 0;
}

几点要注意的地方:
1.我们用一个公有函数Tianshu()来帮助方便我们计算当月天数,switch语句。
2.只有+重载时的
i=i-(q.Tianshu(q.month)-q.day)-1;
要注意,因为是在之后把日期重置为1,所以要在最后-1.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSDN的C知道回答: 以下是Date类的设计和重载的运算符: ```c++ #include <iostream> using namespace std; class Date { private: int year, month, day; public: Date(int y, int m, int d) { year = y; month = m; day = d; } friend ostream& operator<<(ostream& os,const Date& dt); friend istream& operator>>(istream& is, Date& dt); Date operator+(const Date& d1) { Date d(year + d1.year, month + d1.month, day + d1.day); return d; } Date operator-(const Date& d1) { Date d(year - d1.year, month - d1.month, day - d1.day); return d; } Date operator+(int days) { Date d(year, month, day + days); return d; } Date operator-(int days) { Date d(year, month, day - days); return d; } Date& operator++() { day++; if (day > 31) { month++; day = 1; } if (month > 12) { year++; month = 1; } return *this; } Date operator++(int) { Date d(year, month, day); day++; if (day > 31) { month++; day = 1; } if (month > 12) { year++; month = 1; } return d; } bool operator<(const Date& d1) { if (year < d1.year) { return true; } else if (year == d1.year) { if (month < d1.month) { return true; } else if (month == d1.month) { if (day < d1.day) { return true; } } } return false; } bool operator>(const Date& d1) { if (year > d1.year) { return true; } else if (year == d1.year) { if (month > d1.month) { return true; } else if (month == d1.month) { if (day > d1.day) { return true; } } } return false; } bool operator==(const Date& d1) { return year == d1.year && month == d1.month && day == d1.day; } bool operator!=(const Date& d1) { return !(*this == d1); } int operator[](int index) { switch (index) { case 0: return year; case 1: return month; case 2: return day; default: throw "Out of range"; } } }; ostream& operator<<(ostream& os, const Date& dt) { os << dt.year << "-" << dt.month << "-" << dt.day; return os; } istream& operator>>(istream& is, Date& dt) { char dash; is >> dt.year >> dash >> dt.month >> dash >> dt.day; return is; } ``` 使用示例: ```c++ Date d1(2021, 10, 1); Date d2(2021, 10, 10); cout << "d1: " << d1 << endl; cout << "d2: " << d2 << endl; Date d3 = d1 + d2; cout << "d1 + d2: " << d3 << endl; Date d4 = d2 - d1; cout << "d2 - d1: " << d4 << endl; cout << "=======d1++=======" << endl; cout << "d1++: " << d1++ << endl; cout << "d1: " << d1 << endl; cout << "=======++d1=======" << endl; cout << "++d1: " << ++d1 << endl; cout << "d1: " << d1 << endl; if (d1 < d2) { cout << "d1 < d2" << endl; } if (d1 > d2) { cout << "d1 > d2" << endl; } if (d1 == d2) { cout << "d1 == d2" << endl; } if (d1 != d2) { cout << "d1 != d2" << endl; } cout << "d1[0]: " << d1[0] << endl; cout << "d1[1]: " << d1[1] << endl; cout << "d1[2]: " << d1[2] << endl; d1 = d1 + 10; cout << "d1 + 10: " << d1 << endl; d1 = d1 - 10; cout << "d1 - 10: " << d1 << endl; Date d5; cout << "Input a date (yyyy-mm-dd): "; cin >> d5; cout << "You entered: " << d5 << endl; ``` 输出结果: ``` d1: 2021-10-1 d2: 2021-10-10 d1 + d2: 4042-20-11 d2 - d1: 0-0-9 =======d1++======= d1++: 2021-10-1 d1: 2021-10-2 =======++d1======= ++d1: 2021-10-3 d1: 2021-10-3 d1 < d2 d1 != d2 d1[0]: 2021 d1[1]: 10 d1[2]: 3 d1 + 10: 2021-10-13 d1 - 10: 2021-10-3 Input a date (yyyy-mm-dd): 2022-01-01 You entered: 2022-1-1 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值