前言:哈喽小伙伴们,在上一篇文章中我们对C++类与对象的前半段知识进行了简单的分享,其中比较重要的莫过于C++类的六个默认成员函数。
所以这篇文章,我们通过实现一个完整的日期的操作,来对这些成员函数有一个更加深入的理解。
目录
一.基本框架
根据我们过去实现项目的方法,我们需要将声明与定义分离,同时还要实现测试代码与源代码分离,所以我们需要三个文件:
随后进行类的创建,基本成员函数的实现,以及测试代码的创建等框架。
随后进行框架的测试:
二.日期的比较
两个日期之间的比较方式有很多种:>、<、<=、>=、==、!=
这些就需要我们的赋值运算符构造函数出马了。
上篇文章我们已经知道的“>”的写法:
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月,我们就去判断一