日期类代码的实现中
基础结构,我们下面要实现的接口全都属于成员函数:
class Date{
public:
//====实现的接口所处的位置
private:
int _y;
int _m;
int _d;
};
接口实现:
1.获取某年某天的天数
因为对于日期的实现我们要有一个具体的规范,要在所在范围内,不能越界,或者出现32号之类的,而且分为闰年和非闰年也要进行区分,所以我们在这里就可以用到之前所讲的关于闰年的区分,综合之前的写出在固定范围内的规范日期输出.
注意区分闰年和非闰年
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]; //取出其中对应月份的日期
//如果是2月,为闰年,则要修改天数
if (m == 2 && ((y % 4 == 0) && (y % 100 != 0)) || y % 400 == 0){//闰年对应的条件
day += 1; //如果是闰年,则对对应的天数+1
return day; //返回对应的这一天
}
}
2.全缺省构造函数
因为用户在使用我们的类的时候,他有可能输入的日期不是正确的,所以我们要对用户输入的日期进行判断,让代码在正确的日期内进行运行.
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; //如果日期无效,直接输出111
}
else{
_y = y; //如果有效,则按原来的数据进行输入
_m = m;
_d = d;
}
}
3.日期 += 天数
对对应的日期加一个天数,显示加好的天数,这里我们就要考虑在对应的日期加上一个天数的时候,就有可能需要像数字一样的方式进行进位,这样才能正确的显示出日期.
Date& operator+=(int day){
//判断日期是否为负数,如果是负数就将其放在对应的日期-=的操作中
if (day < 0)
return *this -= -day;
//Date :2021.2.4
//假设两个日期相加如果没有约束的时候,它的值就会无限制的增长
//无法按照我们的想法来进行月份的叠加,所以我们需要利用函数进行操作
//1.首先将天数进行相加,看其对应的内容是否会进行溢出
_d += day;
//判断天数是否会溢出
while(_d > getDay(_y, _m)){ //如果有溢出
//减去当月的天数
_d -= getDay(_y, _m);
//月份进行进位
++_m;
//判断月份是否溢出
if (_m == 13){
//年份进位
++_y;
_m = 1;
}
}
return *this;
}
整体不难,主要需要理解
4.日期 + 天数
因为上面对函数已经进行了实现+天数的操作,所以我们后面的就可以直接进行调用,方便一点
Date operator+(int day){
Date tmp = *this; //直接让对应的日期指向tmp
tmp += day; //调用上面的进行+天数
return tmp; //返回值
}
5.日期 - 天数
和上面的一样,直接调用-=就可以了.
Date operator-(int day){
Date copy(*this); //对其日期直接拷贝过来
copy -= day; //-=操作调用
return copy; //返回值
}
6.日期 -= 天数
日期减一个天数的操作,先判断,在分步实现,和+=的操作差不多
Date& operator-=(int day){
//判断日期是否为负数,如果为负责直接转到+=即可
if (day < 0)
return *this += -day;
//首先对对应的日进行相减
_d -= day;
//判断
while (_d <= 0){
//用上一个月的天数回补
--_m;
//判断这个月份是否溢出(向下)
if (_m == 0){
//需要会退到上一年的12月份
_y--;
_m = 12;
}
_d += getDay(_y, _m);
}
return *this;
}
7.前置 ++
简单,直接让对应的this 指针进行+=1的操作即可.
Date& operator++(){
return *this += 1;
}
8.后置 ++
在后置++和前置++的区分,因为在类中定义成员函数的时候,我们不能有两个完全相同的函数出现,所以我们在对应存在的后置++中括号里写入一个int用于进行区分,但是这里写入的int 并没有实际的意义.
Date operator++(int){ //用来区分
Date copy(*this); //直接拷贝对应得日期值
*this += 1; //对其进行++
//返回++之前的值
return copy;
}
9.后置 –
后置–是进行–后输出之前的值
Date operator--(int){
Date copy(*this); //先将其对应的日期进行拷贝出来吧
*this -= 1; //进行-1操作
return copy; //返回之前的值
}
10.前置 –
前置的是先进行–,然后将处理完的值进行输出即可
Date& operator--(){
return *this -= 1; //操作完直接输出
}
11.>运算符重载
因为这里是对于日期的比较,所以我们需要进行重载处理,进行区分
bool operator>(const Date& d){ //这里有两个变量
if (_y > d._y) //先对年进行判断
return true;
else if (_y == d._y){ //当年相等的时候进行月的判断
if (_m > d._m) //月的判断
return true;
else if (_m == d._m){ //在月相等的时候,进行日的判断
if (_d > d._d) //日的判断
return true;
}
}
return false; //如果不大于,则直接输出false
}
12.==运算符重载
等于操作就是在每个都相等的时候输出
bool operator==(const Date& d){
return _y == d._y
&&_m == d._m
&&_d == d._d;
}
13.>=运算符重载
因为我们在上面写了大于和等于的成员函数,所以直接调用即可
bool operator>=(const Date& d){
return *this>d || *this == d;
}
14.<运算符重载
不大于等于就是小于
bool operator<(const Date& d){
return !(*this >= d);
}
15.<=运算符重载
不大于就是小于等于
bool operator<=(const Date& d){
return !(*this>d);
}
16.!=运算符重载
不等于直接调用
bool operator!=(const Date& d){
return !(*this == d);
}
27.日期-日期 返回天数
对于日期相减的操作,我们直接让小的日期一直进行自加,直到相等的时候,将经过自加的日期进行输出即可.
int operator-(const Date& d){
//计算比较小的日期要经过多少次的自加运算,才能和大的日期相同
//自加的次数就是相差的天数
Date max=*this;
Date min = d; //先将两个值进行赋予,完了进行比较
int flag = 1;
if (max < min){ //比较,如果max比较小的话,处理后的值就是一个负数,所以我们在这里
//定义了flag,可以将对应出现的负值转为正值即可
max = d;
min = *this;
flag = -1;
}
int day = 0;
while (min < max){ //如果大于,则内部继续进行++
++min;
++day;
}
return flag*day; //完了直接将相乘的值进行输出即可
}
今天的就是关于日期代码的实现,很多都是调用,只有那么几个核心的代码,大家多看看,很容易进行理解的,一起加油!!!多敲代码!!!