类的定义
class Date {
public:
Date(int y = 1, int m = 1, int d = 1)
{
//判断日期是否有效
if (y <= 0 || m <= 0 || m > 12 || d <= 0 || d > getday(y, m))
{
//日期无效
y = 1;
m = 1;
d = 1;
cout << "日期无效,设为默认值:1-1-1" << endl;
}
else
{
_y = y;
_m = m;
_d = d;
}
}
private:
int _y;
int _m;
int _d;
};
首先来看类的定义:
类中有三个数据成员,_y,_m,_d分别代表年份,月份,天数。
定义了一个带默认参数的构造函数,在构造函数中还加入了日期格式的判断,如果日期不合法,则使用参省值初始化对象(1-1-1)。
getday()
int getday(int y, int m)
{
static int days[] = {
0,31,28,31,30,31,30,31,31,30,31,30,31 };
int day = days[m];
//如果为二月,并且为闰年,修改天数
if (m == 2 && (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)))
day += 1;
return day;
}
这个函数的作用是获取当前月份的天数,创建一个静态数组来存储天数,数组第一个元素设置为0,这这样的话数组下标就可以看作是月份,方便操作。
2月分为闰月29天,及平月28天,注意加上判断。
重载运算符+=
//日期的运算
//Date += int
//左操作数改变为相加后的结果
//2021。2.4 + 90 : 2021.2.94 -28 ---> 2021.3.66 - 31 ---> 2021.4.35 - 30 ---> 2021.5.5
Date& operator+=(int day)
{
//首先天数相加
_d += day;
//判断是否溢出
while (_d > getday(_y, _m))
{
//减去当月天数
_d -= getday(_y, _m);
//月份进位
++_m;
//月份是否溢出
if (_m == 13)
{
//年份进位
++_y;
//月份更新为一月
_m = 1;
}
}
//返回相加之后的结果
return *this;
}
重载+=运算符,是为了实现类的对象与天数进行相加的操作,
例如:
Date a(2021,1,1)+=1; //该操作后a对象的值应该变为a(2021,1,2)
此处要注意月份溢出后,年份进1位,还要将月份重新赋值为1月
友元函数重载<<
ostream& operator<<(ostream& _cout, const Date& d)
{
//_cout << d._y << "-" << d._m << "-" << d._d;
printf("%04d-",d._y);
printf("%02d-", d._m);
printf("%02d", d._d);
return _cout;
}
此处使用友元函数重载<<运算符
是类的对象可以直接用标准输出流对象来输出,更加直观。
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Date {
public:
friend ostream& operator<<(ostream& _cout, const Date& d);
Date(int y = 1, int m = 1, int d = 1)
{
//判断日期是否有效
if (y <= 0 || m <= 0 || m > 12 || d <= 0 || d > getday(y, m))
{
//日期无效
y = 1;
m = 1;
d = 1;
cout << "日期无效,设为默认值:1-1-1" << endl;
}
else
{
_y = y;
_m = m;
_d = d;
}
}
int getday(int y, int m)
{
static int days[] = {
0,31,28,31,30,31,30,31,31,30,31,30,31 };
int day = days[m];
//如果为二月,并且为闰年,修改天数
if (m == 2 && (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)))
day += 1;
return day;
}
//日期的运算
//Date += int
//左操作数改变为相加后的结果
//2021。2.4 + 90 : 2021.2.94 -28 ---> 2021.3.66 - 31 ---> 2021.4.35 - 30 ---> 2021.5.5
Date& operator+=(int day)
{
//首先天数相加
_d += day;
//判断是否溢出
while (_d > getday(_y, _m))
{
//减去当月天数
_d -= getday(_y, _m);
//月份进位
++_m;
//月份是否溢出
if (_m == 13)
{
//年份进位
++_y;
//月份更新为一月
_m = 1;
}
}
//返回相加之后的结果
return *this;
}
private:
int _y;
int _m;
int _d;
};
ostream& operator<<(ostream& _cout, const Date& d)
{
//_cout << d._y << "-" << d._m << "-" << d._d;
printf("%04d-",d._y);
printf("%02d-", d._m);
printf("%02d", d._d);
return _cout;
}
int main()
{
int i = 0;
cin >> i;
int y, m, d,num;
while (i-- > 0)
{
cin >> y >> m >> d >> num;
Date a(y, m, d);
a += num;
cout << a << endl;
}
return 0;
}