实现日期间的运算——C++

在这里插入图片描述

‍️Take your time ! ‍️
个人主页:大魔王
代码仓库:魔王修炼之路
所属专栏:魔王的修炼之路–C++
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞关注,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。

  • 学习完C++入门以及类和对象,我们已经迫不及待的想写一个自己的小项目了,下面这个计算日期的小项目就是运用类和对象写出来的。

Date.h

#pragma once

#include 
#include 
#include 
#include 
#include 

using namespace std;

class Date
{
public:

//获取某年某月的天数
int GetMonthDay(int year, int month);

//全缺省的构造函数
Date(int year = 1900, int month = 1, int day = 1);

//拷贝构造函数
//d2(d1)
Date(const Date& d);

//赋值运算符重载
//d2 = d3 -> d2.operator = (&d2,d3)
Date& operator= (const Date& d);

//析构函数
~Date();

// >运算符重载
bool operator>(const Date& d);

// ==运算符重载
bool operator==(const Date& d);

// >=运算符重载
bool operator>=(const Date& d);

// <
bool operator<(const Date& d);

// <=
bool operator<=(const Date& d);

// !=
bool operator!=(const Date& d);

//日期+=天数
Date& operator += (int day);

//日期+天数
Date operator+(int day);

//日期-天数
Date operator-(int day);

//日期-=天数
Date& operator-=(int day);

//前置++
Date& operator++();

//后置++
Date operator++(int);

//后置--
Date operator--(int);

//前置--
Date& operator--();

//日期-日期 返回天数
int operator-(const Date& d);

//打印
void PrintDate();

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

Date.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include "Date.h"

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


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

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

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

//析构函数
Date:: ~Date()
{
	_year = 0;
	_month = 0;
	_day = 0;
}

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

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

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

// <
bool Date::operator<(const Date& d)
{
	if (*this > d || *this == d)
		return false;
	return true;
}

// <=
bool Date::operator<=(const Date& d)
{
	if (*this < d || *this == d)
		return true;
	return false;

}

// !=
bool Date::operator!=(const Date& d)
{
	if (*this == d)
		return false;
	return true;
}

//下面这两组一共调用两次拷贝构造
// 日期+=天数
Date& Date::operator+=(int day)
{
	this->_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		_month++;
		if (_month > 12)
		{
			_year++;
			_month = 1;
		}
	}
	return *this;
}

// 日期+天数
Date Date::operator+(int day)
{
	//Date temp = *this;
	//与下面的等效,都是用一个已经存在的对象初始化正在创建的对象,
	//编译器会调用拷贝构造函数,而不是赋值运算符重载,不要被表象迷惑。
	Date temp(*this);
	temp += day;
	return temp;
}

//下面这两组一共调用四次拷贝构造
// 日期-天数
Date Date::operator-(int day)
{
	Date temp(*this);
	while (temp._day<day)
	{
		temp._month--;
		if (temp._month == 0)
		{
			temp._year--;
			temp._month = 12;
		}
		temp._day += GetMonthDay(_year, _month);
	}
	temp._day -= day;
	return temp;
}

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

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

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

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

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

//日期 - 日期 -> 返回天数
int Date::operator-(const Date& d)
{
	int year_day = 0;
	int month_day = 0;
	int day_day = 0;

	if (_year != d._year)
	{
		int a = abs(_year - d._year);
		while (a--)
		{
			if (_year > d._year)
			{
				if (GetMonthDay(d._year + a, 2) == 29)
					year_day += 366;
				else
					year_day += 365;
			}
			else
			{
				if (GetMonthDay(_year + a, 2) == 29)
					year_day += 366;
				else
					year_day += 365;
			}
		}
	}
	if (_year < d._year)
		year_day = -year_day;

	if (1)
	{
		int a = _month - 1;
		int _month_day = 0;
		int d_month_day = 0;

		while (a)
		{
			a--;
			_month_day += GetMonthDay(_year, a);
		}
		a = d._month - 1;
		while (a)
		{
			a--;
			d_month_day += GetMonthDay(d._year, a);
		}
		month_day = _month_day - d_month_day;
	}

	if (_day != d._day);
	{
		day_day += _day - d._day;
	}
	return year_day + month_day + day_day;
}


//打印
void Date::PrintDate()
{
	cout << _year << ' ' << _month << ' ' << _day << endl;
}

test.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include "Date.h"

int main()
{
	//Date d1(2020, 1, 1);
	//Date d2(d1);
	//d2 += 2;
	//Date d4(++d1);

	//d1.PrintDate();
	//d2.PrintDate();
	//d4.PrintDate();

	//cout << d1 - d2 << endl;
	
	//Date d3(2018, 8, 23);
	//cout << d1- d3 << endl;

	//cout << (d1 < d2) << endl;
	
	Date d1(2004, 4, 6);
	Date d2(2023, 10, 13);
	cout << d2 - d1 << endl;
	return 0;
}
  • 以上就是我们通过学习类和对象编写的第一个cpp小项目,可以用来比较日期大小、相减得出两个日期间相差多少天、一个日期加上一个天数所得的另一个日期等等。


  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

专栏推荐
魔王的修炼之路–C语言
魔王的修炼之路–数据结构初阶
魔王的修炼之路–C++
魔王的修炼之路–Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

你可能感兴趣的:(魔王的修炼之路——C++,c++,开发语言)