C++——日期类

本文详细介绍了如何通过C++实现日期类,包括比较、加减运算、输入输出等,并展示了如何重载赋值运算符和使用友元函数解决类外函数的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:哈喽小伙伴们,在上一篇文章中我们对C++类与对象的前半段知识进行了简单的分享,其中比较重要的莫过于C++类的六个默认成员函数

所以这篇文章,我们通过实现一个完整的日期的操作,来对这些成员函数有一个更加深入的理解


目录

一.基本框架

二.日期的比较

三.日期的加减运算

 1.得到月的天数

2.日期的加运算

3.日期的减运算

4.日期的++--运算

5.日期减日期

6.日期的输入输出

7.存在的问题

总结


一.基本框架

根据我们过去实现项目的方法,我们需要将声明与定义分离,同时还要实现测试代码与源代码分离,所以我们需要三个文件:

随后进行类的创建,基本成员函数的实现,以及测试代码的创建等框架。 

随后进行框架的测试:


二.日期的比较

两个日期之间的比较方式有很多种:>、<、<=、>=、==、!=

这些就需要我们的赋值运算符构造函数出马了。

上篇文章我们已经知道的“>”的写法:


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

但是就这一个的写法,就已经是很多,很麻烦的一段代码了,难道像这样的代码我们一共要写6个吗???当然不需要,我们要知道,这些符号之间都有两两互补的关系

比如说,我们现在写出了“>”,那么“<=”不就是“>”取反吗

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

 我们建议把“==”给写出来,因为它比较容易写:

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);
}

现在我们同时拥有了“>”和“==”,那么将两者结合自然就得到了“>=”

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

这样是不是非常的简洁???其余符号的代码就不一一列举啦,详情请看最后的完整代码展示。


三.日期的加减运算

日期的加减是一个相对比较困难的运算,它不像数字的加减那样简单,因为不仅存在大小月的天数不一,而且每四年还会出现闰年的特殊情况,这样就会导致进位非常的麻烦。下面我们就来详细分享一下,如此复杂的日期运算,到底该怎么实现。 


 1.得到月的天数

首先很重要的一点就是我们要能够知道每个月都分别有多少天,同时还有2月这个特殊的月份,我们通过一个函数来实现:

int GetMonthdays(int year, int month)
{
	assert(month > 0 && month < 13);
	int Monthdays[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
	{
		return 29;
	}
	return Monthdays[month - 1];
}

首先要做的就是assert断言,防止月份输入错误,其次因为闰年是斯四年一次,所以我们默认情况下都是平年,通过数组来记录,能够方便获取。最后就是进行闰年二月的判断,如果2月,我们就去判断一

评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

很楠不爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值