【C++】类和对象实际应用之日期类详解
2024-01-09 16:30:32
目录
我们之前学习了类和对象、构造函数和析构函数以及拷贝构造函数。为了对他们有更加深入的了解和应用,今天小编将手把手带你实现简易的日期计算器。
一、目标
?通过自定义一个日期类可以来实现简易的日期计算器。
?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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!