首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【落羽的落羽 C++】日期类(Date)的完整实现

【落羽的落羽 C++】日期类(Date)的完整实现

作者头像
落羽的落羽
发布2025-12-18 19:13:29
发布2025-12-18 19:13:29
510
举报

通过上一篇C++类和对象的学习,我们可以完整实现Date类以及它的各种常见用法了:

代码语言:javascript
复制
class Date
{
public:

	// 获取某年某月的天数
    int GetMonthDay(int year, int month)
	{
		static int monthDayArray[13] = { -1,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;
		}
		else
		{
			return monthDayArray[month];
		}
	}


	// 全缺省的构造函数
	Date(int year = 1900, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
	}


	// 拷贝构造函数
    // d2(d1)
	Date(const Date& d)
		:_year(d._year)
		, _month(d._month)
		, _day(d._day)
	{
	}


	// 赋值运算符重载
    // d2 = d3 -> d2.operator=(&d2, d3)
	Date& operator=(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
		return *this;
	}


	// 析构函数
	~Date()
	{
	}

    // 友元声明
	friend ostream& operator<<(ostream& out, const Date& d);
	friend istream& operator>>(istream& out, Date& d);

	// 日期+=天数
	Date& operator+=(int day)
	{
		if (day < 0)
		{
			return *this -= -day;
		}

		_day += day;
		while (_day > GetMonthDay(_year, _month))
		{
			_day -= GetMonthDay(_year, _month);
			++_month;
			if (_month == 13)
			{
				++_year;
				_month = 1;
			}
		}
		return *this;
	}

	// 日期+天数
	Date operator+(int day)
	{
		Date ret = *this;
		ret += day;
		return ret;
	}


	// 日期-天数
	Date operator-(int day)
	{
		Date ret = *this;
		ret -= day;
		return ret;
	}

	// 日期-=天数
	Date& operator-=(int day)
	{
		if (day < 0)
		{
			return *this += -day;
		}

		_day -= day;
		while (_day <= 0)
		{
			--_month;
			if (_month == 0)
			{
				_month = 12;
				--_year;
			}
			_day += GetMonthDay(_year, _month);
		}
		return *this;
	}


	// 前置++
	Date& operator++()
	{
		*this += 1;
		return *this;
	}


	// 后置++
	Date operator++(int)
	{
		Date ret = *this;
		*this += 1;
		return ret;
	}


	// 后置--
	Date operator--(int)
	{
		Date ret = *this;
		*this -= 1;
		return ret;
	}

	// 前置--
	Date& operator--()
	{
		*this -= 1;
		return *this;
	}


	// >运算符重载
	bool operator>(const Date& d)
	{
		return !(*this <= d);
	}


	// ==运算符重载
	bool operator==(const Date& d)
	{
		return _year == d._year
			&& _month == d._month
			&& _day == d._day;
	}


	// >=运算符重载
	bool operator>=(const Date& d)
	{
		return !(*this < d);
	}

	// <运算符重载
	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)
			{
				if (_day < d._day)
				{
					return true;
				}
			}
		}
		return false;
	}

	// <=运算符重载
	bool operator <= (const Date& d)
	{
		return *this == d || *this < d;
	}


	// !=运算符重载
	bool operator != (const Date& d)
	{
		return !(*this == d);
	}

	// 日期-日期,返回相差的天数
	int operator-(const Date& d)
	{
		Date max = *this;
		Date min = d;
		int flag = 1;
		if (*this < d)
		{
			max = d;
			min = *this;
			flag = -1;
		}
		int n = 0;
		while (min != max)
		{
			++min;
			++n;
		}
		return n * flag;
	}

private:
	int _year;
	int _month;
	int _day;
};

ostream& operator<<(ostream& out, const Date& d)
{
	out << d._year << ' ' << d._month << ' ' << d._day;
	return out;
}

istream& operator>>(istream& in, Date& d)
{
	cout << "请依次输入年月日:" << endl;
	in >> d._year >> d._month >> d._day;
	if (d._month < 1 || d._month>12 || d._day<1 || d._day>d.GetMonthDay(d._year, d._month))
	{
		cout << "日期非法" << endl;
	}
	return in;
}

简单测试:

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档