目录
一、前言
在我们的日常生活中,我们可能需要计算几天后的日期,或计算日期差等,现如今计算日期的方式有很多,简单粗暴的直接查看日历,快捷点的直接使用日期计算器来求得,先给一个网络上的日期计算器截图:
现在,就让我们用代码来实现其工作原理吧。
- 注意:本篇日期类.h文件放声明,.cpp文件放定义
二、日期类的实现
检查日期的合法性
实现日期类首先就得检查日期的合法性,这其中就包括大小月,闰年的2月有29天,一年只有12个月等等细节都要考虑到。
class Date { public: bool isLeapYear(int year) //判断是否为闰年 { //四年一闰百年不闰或四百年一闰 return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } int GetMonthDay(int year, int month) { //加上static防止函数频繁调用开辟几十个字节大小的数组,最好加上 static int monthDayArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; if (month == 2 && isLeapYear(year)) return 29; //闰月29天 else return monthDayArray[month]; } Date(int year = 1, int month = 1, int day = 1) { if (year >= 1 && month <= 12 && month >= 1 && day <= GetMonthDay(year, month)) { //确保日期合法 _year = year; _month = month; _day = day; } } private: int _year; int _month; int _day; };
< 运算符重载
- 思路:
< 运算符重载在我上一篇博文已经详细讲解过,主要是先把大于的情况全部统计出来,就比如我要比较实例化对象d1是否小于实例化对象d2,只需考虑如下三种满足的情况:
- d1的年小于d2的年
- d1与d2年相等,d1的月小于d2的月
- d1与d2年相等月相等,d1的天小于d2的天
这三种全是小于的情况,返回true,其余返回false
- 代码如下:
// <运算符重载 bool Date::operator<(const Date& d) const //类外访问成员函数需要设定类域 { if (_year < d._year || _year == d._year && _month < d._month || _year == d._year && _month == d._month && _day < d._day) return true; else return false; }
== 运算符重载
- 思路:
== 运算符重载其实非常简单,只需要判断d1和d2的年、月、天是否对应相等即可:
- 代码如下:
// ==运算符重载 bool Date::operator==(const Date& d) const { return _year == d._year && _month == d._month && _day == d._day; }
<= 运算符重载
- 思路: -- 复用
<= 的运算符重载,这里要仔细想一想 <= 成立的条件是啥。不就是 要么 < 要么 = 吗?我们只需要复用先前写的 < 运算符重载和 <=运算符重载,无需自己费老大劲推导其内部原理。
- 代码如下:
// <=运算符重载 bool Date::operator<=(const Date& d) const { return *this < d || *this == d; }
> 运算符重载
- 思路: -- 复用
> 的反义就是 <=,所以我们只需要复用


最低0.47元/天 解锁文章
1772

被折叠的 条评论
为什么被折叠?



