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;
}
相关推荐
小坏坏的大世界2 小时前
C++ STL常用容器总结(vector, deque, list, map, set)
c++·算法
wjs20243 小时前
状态模式(State Pattern)
开发语言
我命由我123453 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
liulilittle3 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
励志要当大牛的小白菜4 小时前
ART配对软件使用
开发语言·c++·qt·算法
PAK向日葵5 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
爱装代码的小瓶子6 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
Maybe_ch8 小时前
.NET-键控服务依赖注入
开发语言·c#·.net
超浪的晨8 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
终焉暴龙王8 小时前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php