Date类

Date.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#pragma once
#include<iostream>
using namespace std;
class Date
{
private:
int _year;
int _month;
int _day;
public:
//构造函数
Date(int year=0, int month=1, int day=1);//缺省参数不能声名和定义都有,最好就声名有就可以了
void Print();
int GetMonthDay(int year, int day);//获得这月的天数
//运算符的重载

//所有类都是这样使用的
bool operator>(const Date& d);
//bool operator==(const Date& d);
Date& operator=(const Date& d);
//加天数
Date& operator+=(const int& day);

//减天数
Date& operator-=(const int& day);
Date& operator-(const int& day);


Date operator+(const int& day);
//++d
Date& operator++();//单目运算符,只有一个参数this,


//d++,增加一个参数原来占位,进行函数重载
Date operator++(int );


Date operator--(int);
Date& operator--();
//判断相等
bool operator==(const Date& d);
bool operator<(const Date& d);
bool operator>=(const Date& d);
//日期相减,
int operator-(const Date& d);
void PrintWeekDay();
};

Date.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#include"Date.h"


int Date::GetMonthDay(int year, int month)//获得每个月的天数
{
//每次进来都要弄一下这数组,所以我们可以考虑弄成静态的,就不用每次进来都开辟数组,浪费空间
static int MonthDay[13] = { 0 ,31,28,31,30,31,30,31,31,30,31,30,31};//用数组来获得,默认2月28天,
//if ((year % 4 == 0 && year % 100 != 0) ||( year % 400 == 0)&&month==2)//可以先判断闰年
//{
// MonthDay[2] = 29;
//}

if (month == 2)//先判断是否为2月再选择是否要进入
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
MonthDay[2] = 29;
}
}

return MonthDay[month];
}


Date::Date(int year, int month , int day)//在外面引用加个::,构造函数
{
_year = year;
_month = month;
_day = day;
//检查一下日期是否合法
if (!(_year >= 0 && _month >= 0 && _month<13 && _day>0 && day <= GetMonthDay(year, month)))//整体取个非
{
cout << "非法日期" << endl;
Print();//类里面还可以访问成员函数
}

}

void Date::Print()
{
cout << _year <<"-" << _month <<"-" << _day << endl;
}


//>的重载
bool Date::operator>(const Date& d)
{
if (_year > d._year)
{
return true;
}
else if (_year == d._year && _month > d._month)
{
return true;
}
else if (_year == d._year && _month == d._month && _day > d._day)
{
return true;
}
else
{
return false;
}
}


Date& Date::operator+=(const int& day)//日期加天数,一直进位,天满了往月进位,月满了往年进位
{
_day += day;
while (_day >= GetMonthDay(_year, _month))
{
_day -= GetMonthDay(_year, _month);
_month++;
if (_month == 13)
{
_year++;
_month -= 12;
}
}
return *this;//返回的是Date类型的,所以返回*this就可以了,出了作用域还在,所以我们用引用返回


}


//不想改变原来的值
Date Date::operator+(const int& day)
{
Date ret(*this);//拷贝构造
//我们可以直接调用+=
ret += 100;
return ret;
}


Date Date::operator++(int)//后置++,返回之前的值,d++
{
Date ret(*this);//用拷贝构造接收之前的值
*this += 1;

return ret;
}


//推荐以后自定义类型++用前置,这样就可以不用做无用的拷贝构造

Date& Date::operator++()//前置++,返回之后的值
{

*this += 1;

return *this;
}

bool Date::operator==(const Date& d)//判断相等
{
return _year == d._year && _month == d._month && _day == d._day;
}

bool Date:: operator>=(const Date& d)
{
return *this > d || *this == d;
}


bool Date::operator<(const Date& d)
{
return !((*this) >= d);//小于是>=取反
}


//2022 1 17
// 30
// -13
//2021 12 18


//日期不合法就往月去借,月不够了就往年去借


Date& Date::operator-=(const int& day)
{

if (day < 0)
{
return *this += -day;
}
_day -= day;
while (_day < 1)
{
--_month;
if (_month == 0)//月也不合法
{
--_year;//年也减
_month = 12;//将他置为12
_day += GetMonthDay(_year, _month) ;
}
}

return *this;
}

Date& Date::operator-(const int& day)
{
Date ret(*this);
ret -= day;
return ret;
}


Date Date::operator--(int)//后置++,返回之前的值
{

*this -= 1;
Date ret(*this);
return ret;
}


//推荐以后自定义类型++用前置,这样就可以不用做无用的拷贝构造

Date& Date::operator--()//前置++,返回之后的值
{

*this -= 1;

return *this;
}



// 2022 9 1
//- 2022 1 17
// 0 8 -16
// 0 7 15

Date& Date::operator=(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
return *this;
}



//实现日期相减
int Date::operator-(const Date& d)//构成函数重载//d1-d2,我们不知道谁大谁小,所以大小是他们的绝对值,最后乘一个1或-1
{
//让小的那个天数加到大的天,有多少天就加多少天
Date less = *this;
Date more = d;
//一开始假设*this小也就是d1小减出来是一个负数
int flag = -1;
if (*this > d)
{
less = d;
more = *this;
flag = 1;
}

int day = 0;
while (!(less == more))
{
day++;
less++;
}
return day*flag;//前小后大,就是负的,后小前大就是正的


}

//获取今天是星期几

//1971的1月1日星期五,作为一个基准
void Date::PrintWeekDay()
{
const char* arr[7] = { "星期1","星期2","星期3","星期4","星期5" ,"星期6","星期7" };

Date start(1900, 1, 1);
int count = *this - start;
cout << arr[count%7] << endl;
}

test.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void Test1()
{
Date d1;
Date d2(2022, 1, 16);
d1.Print();
d2.Print();
Date d3(2022, 13, 15);
Date d4(2022, 2, 29);
Date d5(2020, 2, 29);
d5.Print();
d4.Print();
//想算一下100天后是多少天
d2 += 100;
d2.Print();
//实现d1+100;不改变d1的值
Date ret = d1 + 100;
ret.Print();
Date ret1 = d1++;//实现后置++,先使用再自增
Date ret2 = ++d1;

Date d6(2022, 1, 17);
d6 -= 30;
d6.Print();
Date k = d2 - 20;
k.Print();
Date d7(2022, 1, 12);
Date d8(2022, 1, 22);
int day = d7 - d8;
d7.PrintWeekDay();

}


Date类
http://example.com/2022/01/28/Date类/
作者
Zevin
发布于
2022年1月28日
许可协议