C++日期类的实现

前言:在类和对象比较熟悉的情况下,我们我们就可以开始制作日期表了,实现日期类所包含的知识点有构造函数,析构函数,函数重载,拷贝构造函数,运算符重载,const成员函数

1.日期类的加减运算

复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"data.h"
class Data
{
public:
	//获取某年某月的天数
	int GetMonthday(int year, int month)
	{
		int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		int day = days[month];
		if (month == 2)
		{
			if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
			{
				day += 1;
			}
		}
		return day;
	}
	Data(int year=1900,int month=1,int day=1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//拷贝构造
	//Data(const Data& d);

	//日期赋值
	Data& operator = (const Data & d) const
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
		return *this;
	}


	Data& operator-=(int day)
	{
		_day -= day;
		while (_day <= 0)
		{
			if (_month == 1)
			{
				_year--;
				_month = 12;
			}
			else
			{
				_month--;
			}
			_day = GetMonthday(_year, _month) + _day;
		}
		return *this;
	}

	Data& operator+=(int day)
	{
		_day += day;
		while (_day > GetMonthday(_year, _month))
		{
			_day = _day - GetMonthday(_year, _month);
			_month++;
			if (_month == 13)
			{
				_year++;
				_month = 1;
			}
		}
		return *this;
	}

	void Print(const Data& d)
	{
		cout << _year << "年" << _month << "月" << _day << "日" << endl;
	}
	

private:
	int _year;
	int _month;
	int _day;

};



int main()
{
	Data d1(2023,12,31);
	Data d2(d1);
    
	d2 = d2.operator+=(10000);
	d2.Print(d2);
	return 0;
}

2 日期类的运算符重载

类里面有默认的拷贝构造函数(不显含),还有默认的构造函数(不显含),你也可以把这个默认的构造函数写出来,只是不显含的构造函数对类里面的内置类型不做处理,自定义类型会调用它的构造函数,就会处理一下。

复制代码
//日期赋值
Data& operator = (const Data & d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
	return *this;
}


Data& operator-=(int day)
{
	_day -= day;
	while (_day <= 0)
	{
		if (_month == 1)
		{
			_year--;
			_month = 12;
		}
		else
		{
			_month--;
		}
		_day = GetMonthday(_year, _month) + _day;
	}
	return *this;
}

Data& operator+=(int day)
{
	_day += day;
	while (_day > GetMonthday(_year, _month))
	{
		_day = _day - GetMonthday(_year, _month);
		_month++;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}
	}
	return *this;
}

Data& operator++()//前置++
{
	_day++;
	if (_day > GetMonthday(_year, _month))
	{
		_day = _day - GetMonthday(_year, _month);
		_month++;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}
		
	}
	return *this;
}

Data& operator++(int)//后置++
{
	Data d = *this;
	++_day;
	return d;
}

//运算符重载,比较两个日期的大小
bool operator>(const Data& d)
{
	return ((_year > d._year) || (_year==d._year&&_month > d._month) || (_year == d._year && _month == d._month&&_day > d._day));
}

bool operator>=(const Data& d)
{
	return !((_year < d._year) || (_year == d._year && _month < d._month) || (_year == d._year && _month == d._month && _day < d._day));
}

bool operator<(const Data& d)
{
	return ((_year < d._year) || (_year == d._year && _month < d._month) || (_year == d._year && _month == d._month && _day < d._day));
}

bool operator<=(const Data& d)
{
	return !((_year > d._year) || (_year > d._year && _month > d._month) || (_year == d._year && _month == d._month && _day > d._day));

}

bool operator!=(const Data& d)
{
	return !((_year == d._year) && (_month == d._month) && (_day == d._day));
}

int operator-(Data& d)
{
	
	Data max = *this;
	Data min = d;
	int flag = 1;
	if (*this < d)
	{
		max = d;
		min = *this;
		flag = -1;
	}
	int n = 0;
	while (min != max)
	{
		++min;
		++n;
	}
	return flag * n;
}

3 我们将运算符重载的函数和两个日期相差的天数进行配合计算

复制代码
int operator-(Data& d)
{
	
	Data max = *this;
	Data min = d;
	int flag = 1;
	if (*this < d)
	{
		max = d;
		min = *this;
		flag = -1;
	}
	int n = 0;
	while (min != max)
	{
		++min;
		++n;
	}
	return flag * n;
}

int main()
{
	Data d1(2023,12,31);
	//Data d2(d1);
	Data d2(1900,11,30);
    
	//d2 = d2.operator+=(10000);
	d2.Print(d2);
	cout << d2.operator-(d1) << endl;
	return 0;
}

所有源码的实现如下

复制代码
data.h


#pragma once
#include<iostream>
using namespace std;
class Data
{
public:
	//获取某年某月的天数
	int GetMonthday(int year, int month)
	{
		int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		int day = days[month];
		if (month == 2)
		{
			if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
			{
				day += 1;
			}
		}
		return day;
	}
	Data(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//拷贝构造
	//Data(const Data& d);

	//日期赋值
	Data& operator = (const Data& d);


	Data& operator-=(int day);
	
	Data& operator+=(int day);
	

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

	Data& operator++(int);//后置++
	

	//运算符重载,比较两个日期的大小
	bool operator>(const Data& d);

	bool operator>=(const Data& d);

	bool operator<(const Data& d);

	bool operator<=(const Data& d);

	bool operator!=(const Data& d);

	int operator-(Data& d);

	void Print(const Data& d);


private:
	int _year;
	int _month;
	int _day;

};



data.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include"data.h"
Data& Data::operator = (const Data& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
	return *this;
}


Data& Data::operator-=(int day)
{
	_day -= day;
	while (_day <= 0)
	{
		if (_month == 1)
		{
			_year--;
			_month = 12;
		}
		else
		{
			_month--;
		}
		_day = GetMonthday(_year, _month) + _day;
	}
	return *this;
}

Data& Data::operator+=(int day)
{
	_day += day;
	while (_day > GetMonthday(_year, _month))
	{
		_day = _day - GetMonthday(_year, _month);
		_month++;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}
	}
	return *this;
}

Data& Data::operator++()//前置++
{
	_day++;
	if (_day > GetMonthday(_year, _month))
	{
		_day = _day - GetMonthday(_year, _month);
		_month++;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}

	}
	return *this;
}

Data& Data::operator++(int)//后置++
{
	Data d = *this;
	++_day;
	return d;
}

//运算符重载,比较两个日期的大小
bool Data::operator>(const Data& d)
{
	return ((_year > d._year) || (_year == d._year && _month > d._month) || (_year == d._year && _month == d._month && _day > d._day));
}

bool Data::operator>=(const Data& d)
{
	return !((_year < d._year) || (_year == d._year && _month < d._month) || (_year == d._year && _month == d._month && _day < d._day));
}

bool Data::operator<(const Data& d)
{
	return ((_year < d._year) || (_year == d._year && _month < d._month) || (_year == d._year && _month == d._month && _day < d._day));
}

bool Data::operator<=(const Data& d)
{
	return !((_year > d._year) || (_year > d._year && _month > d._month) || (_year == d._year && _month == d._month && _day > d._day));

}

bool Data::operator!=(const Data& d)
{
	return !((_year == d._year) && (_month == d._month) && (_day == d._day));
}

int Data::operator-(Data& d)
{

	Data max = *this;
	Data min = d;
	int flag = 1;
	if (*this < d)
	{
		max = d;
		min = *this;
		flag = -1;
	}
	int n = 0;
	while (min != max)
	{
		++min;
		++n;
	}
	return flag * n;
}

void Data::Print(const Data& d)
{
	cout << _year << "年" << _month << "月" << _day << "日" << endl;
}



int main()
{
	Data d1(2023,12,31);
	//Data d2(d1);
	Data d2(1900,11,30);
    
	//d2 = d2.operator+=(10000);
	d2.Print(d2);
	cout << d2.operator-(d1) << endl;
	return 0;
}
相关推荐
秋田君11 分钟前
Qt_QVariant
开发语言·qt
江华森15 分钟前
Python 实现高德地图找房(三):地图可视化与高德 JS API
开发语言·javascript·python
weixin_4713830320 分钟前
args,...args与Parameters<T>
开发语言·前端
来一碗刘肉面23 分钟前
C++中的引用语法
c++·算法
杜子不疼.28 分钟前
【Qt初识】工程起步:项目创建、代码解读与对象树
数据库·c++·qt
ctrl_v助手1 小时前
C#表达题笔记
开发语言·c#
汉克老师2 小时前
GESP2026年6月认证C++八级( 第二部分判断题(1-10))精讲
c++·归并排序·dijkstra·二分·互斥·gesp8级·可重复组合
2zcode2 小时前
基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn
米饭不加菜2 小时前
使用万用表判断三极管(BJT)好坏
java·开发语言
绝世唐门三哥2 小时前
vue3中页面返回时刷新首页的处理方案
开发语言·前端·javascript