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;
}

相关推荐

  1. C++日期实现

    2024-01-02 06:00:03       9 阅读
  2. c++日期实现

    2024-01-02 06:00:03       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-02 06:00:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-02 06:00:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-02 06:00:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-02 06:00:03       20 阅读

热门阅读

  1. ASP.NET Core SignalR推送服务器日志

    2024-01-02 06:00:03       32 阅读
  2. 再见2023,你好2024

    2024-01-02 06:00:03       30 阅读
  3. 机器学习 | Python实现基于GRNN神经网络模型

    2024-01-02 06:00:03       41 阅读
  4. LLM、AGI、多模态AI 篇三:微调模型

    2024-01-02 06:00:03       37 阅读
  5. 代码随想录刷题笔记(DAY 6)

    2024-01-02 06:00:03       39 阅读
  6. 业务中台-研发篇

    2024-01-02 06:00:03       26 阅读
  7. Linux: syscfg: network:inet_peer_threshold

    2024-01-02 06:00:03       41 阅读