【C++】类和对象实际应用之日期类详解

2024-01-09 16:30:32

目录

一、目标

二、实现日期类

?1、判断合法性和默认赋值

2、日期加/减天数。

?1)日期相关判断

① operator==

??②?operator !=?

?③operator <?

④operator <=

?⑤operator >?

⑥operator >=

2)日期加减天数

① operator+=(int day)

?②operator+(int day)

?③?operator -=(int day)

④operator - (int day)

3)两个日期差值

三、总结

我们之前学习了类和对象、构造函数和析构函数以及拷贝构造函数。为了对他们有更加深入的了解和应用,今天小编将手把手带你实现简易的日期计算器。

一、目标

?通过自定义一个日期类可以来实现简易的日期计算器。

?1、我们要定义一个日期类,声明和定义相分离,头文件包括成员函数的声明。

?2、在普通cpp文件中定义成员函数。

?3、在main函数中对成员函数进行测试和优化。

?要实现的功能:?

1、可以输入一个合法的日期(若没有输入,则进行默认赋值) ? ? ? ?

2、在日期上加上/减少一定的天数。

3、计算两个日期中间的差值。

二、实现日期类

?1、判断合法性和默认赋值

思路:所以我们需要对年、月、日进行判断。年暂时没有限制条件;月需要大于0小于13;日期不能大于对应月的日期。但是每个月的日期是不一样的,根据闰年和平年2月份的日期也会有所差距。

//每个月具体天数
int Date::GetMonthDay(int year, int month)
{
	assert(month > 0 && month < 13);

	int monthArray[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 monthArray[month];
	}
}

//对日期的合法性判断
Date::Date(int year, int month, int day)
{
	if (month > 0 && month < 13
		&& (day > 0 && day <= GetMonthDay(year, month)))
	{
		_year = year;
		_month = month;
		_day = day;
	}
	else
	{
		cout << "日期非法" << endl;
	}
}

2、日期加/减天数。

?1)日期相关判断

① operator==
bool Date::operator==(const Date& d)
{
	return _year == d._year
		&& _month == d._month
		&& _day == d._day;
}
?②?operator !=?
bool Date::operator!=(const Date& d)
{
	return !(*this == d);
}
③operator <?
bool Date::operator<(const Date& d)
{
	return _year < d._year
		|| (_year == d._year && _month < d._month)
		|| (_year == d._year && _month == d._month && _day < d._day);
}

④operator <=
bool Date::operator<=(const Date& d)
{
	return *this < d || *this == d;
}
⑤operator >?
bool Date::operator>(const Date& d)
{
	return !(*this <= d);
}

⑥operator >=
bool Date::operator>=(const Date& d)
{
	return !(*this < d);
}

2)日期加减天数

① operator+=(int day)
Date& Date::operator+=(int day)
{
	_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		_month++;
		if (_month == 13)
		{
			++_year;
			_month = 1;
		}
	}

	return *this;
}

?②operator+(int day)
//方法一:
Date Date::operator+(int day)
{
	Date tmp(*this);

	tmp += day;

	return tmp;
}


//方法二:
Date Date::operator+(int day)
{
	Date tmp(*this);

	tmp._day += day;
	while (tmp._day > GetMonthDay(tmp._year, tmp._month))
	{
		tmp._day -= GetMonthDay(tmp._year, tmp._month);
		tmp._month++;
		if (tmp._month == 13)
		{
			++tmp._year;
			tmp._month = 1;
		}
	}

	return tmp;
}
③?operator -=(int day)
Date& Date::operator-=(int day) 
{
	if (day < 0)
	{
		*this += -day;
		return *this;
	}

	_day -= day;
	while (_day <= 0)
	{
		--_month;
		if (_month == 0)
		{
			--_year;
			_month = 12;
		}

		_day += GetMonthDay(_year, _month);
	}

	return *this;
}

④operator - (int day)
Date Date::operator-(int day) 
{
	Date tmp(*this);
	tmp -= day;
	return tmp;
}

?

3)两个日期差值

int Date::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;
}

?

三、总结

?在头文件写入函数声明

#define  _CRT_SECURE_NO_WARNINGS
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1);//构造函数带缺省值;
	void Print();//打印对应的日期;
	int GetMonthDay(int year, int month);//得出每个月的天数

	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);//

	int operator-(const Date& d);//两个日期相差多少天

	Date& operator++();//前置++
	Date operator++(int);//后置++
    
    Date& operator--();//前置--
	// d1-- -> d1.operator--(1)
	Date operator--(int);//后置--

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

在cpp文件写入函数定义

#include"Date.h"

//每个月具体天数
int Date::GetMonthDay(int year, int month)
{
	assert(month > 0 && month < 13);

	int monthArray[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 monthArray[month];
	}
}

//对日期的合法性判断
Date::Date(int year, int month, int day)
{
	if (month > 0 && month < 13
		&& (day > 0 && day <= GetMonthDay(year, month)))
	{
		_year = year;
		_month = month;
		_day = day;
	}
	else
	{
		cout << "日期非法" << endl;
	}
}

//打印日期
void Date::Print()
{
	cout << _year << "/" << _month << "/" << _day << endl;
}

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

// d1 < d2
bool Date::operator<(const Date& d)
{
	return _year < d._year
		|| (_year == d._year && _month < d._month)
		|| (_year == d._year && _month == d._month && _day < d._day);
}

// d1 <= d2
bool Date::operator<=(const Date& d)
{
	return *this < d || *this == d;
}

// d1 > d2
bool Date::operator>(const Date& d)
{
	return !(*this <= d);
}

bool Date::operator>=(const Date& d)
{
	return !(*this < d);
}

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

Date& Date::operator+=(int day)
{
	_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		_month++;
		if (_month == 13)
		{
			++_year;
			_month = 1;
		}
	}

	return *this;
}


Date Date::operator+(int day)
{
	Date tmp(*this);

	tmp += day;

	return tmp;
}

//Date Date::operator+(int day)
//{
//	Date tmp(*this);
//
//	tmp._day += day;
//	while (tmp._day > GetMonthDay(tmp._year, tmp._month))
//	{
//		tmp._day -= GetMonthDay(tmp._year, tmp._month);
//		tmp._month++;
//		if (tmp._month == 13)
//		{
//			++tmp._year;
//			tmp._month = 1;
//		}
//	}
//
//	return tmp;
//}
//


Date& Date::operator-=(int day)
{
	if (day < 0)
	{
		*this += -day;
		return *this;
	}

	_day -= day;
	while (_day <= 0)
	{
		--_month;
		if (_month == 0)
		{
			--_year;
			_month = 12;
		}

		_day += GetMonthDay(_year, _month);
	}

	return *this;
}

Date Date::operator-(int day)
{
	Date tmp(*this);
	tmp -= day;
	return tmp;
}

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

// d1++
Date Date::operator++(int)
{
	Date tmp(*this);

	*this += 1;

	return tmp;
}

int Date::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;
}

文章来源:https://blog.csdn.net/Dawn_Lillian/article/details/135309744
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。