C++--类与对象(中)--日期类代码的具体实现(详细解释)


基础结构,我们下面要实现的接口全都属于成员函数:

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;		//完了直接将相乘的值进行输出即可
	}

今天的就是关于日期代码的实现,很多都是调用,只有那么几个核心的代码,大家多看看,很容易进行理解的,一起加油!!!多敲代码!!!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值