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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323086.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】——期末复习题库(6)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

线程池的shutdown和shutdownnow的区别

1、先说结论 shutdown ---- 不再接收新的任务&#xff0c;但是已经在执行中和队列中的任务会等待执行完成&#xff0c; 对workers中空闲的线程执行interrupt shutdownnow ---- 不再接收新的任务&#xff0c;清空队列的任务&#xff0c;对works中所有的线程执行interrupt&…

2024年您应该知道的 12个绝佳且免费的 AI 工具

2024年&#xff0c;人工智能的世界会继续让我们着迷。 这里收集了12 个免费的 AI 工具&#xff0c;其中大多数易于使用&#xff0c;还有一些复杂的。无论如何&#xff0c;AI 将会给我们的工作和生活带来巨大的改变&#xff0c;了解并掌握最适合自己的工作至关重要。 1、Adobe …

【springboot+vue项目(十一)】springboot整合EasyExcel

EasyExcel是阿里巴巴开源的一个Java库&#xff0c;用于操作Excel文件。它提供了简单易用的API&#xff0c;可以读取、写入和转换Excel文件&#xff0c;支持大量数据的导入和导出操作。 一、添加依赖&#xff08;版本3.2&#xff09; <!--easyexcel操作excel--> <depe…

BUG-由浏览器缩放引起PC端显示手机端视图

文章目录 来源解决 来源 启动Vue项目&#xff0c;用浏览器打开显示手机端视图&#xff0c;从vscode直接ctrl链接打开正常显示。 检查-未开启仿真&#xff0c;但仍显示错误。 解决 浏览器缩放问题。 修改为100%

宝宝洗衣机哪个牌子质量好?好用的小型洗衣机推荐

当婴儿的到来&#xff0c;确实会给家庭带来许多变化&#xff0c;就好比如对于宝宝相关衣物的清洗需求。对于新生儿及婴幼儿的衣服&#xff0c;一般都要给予特殊的照顾与清洗&#xff0c;以保证不含细菌及过敏原。尤其是刚刚出生的婴儿&#xff0c;这时候宝宝们的皮肤很是幼嫩。…

法二(命令行):YOLOv5打包.exe

0 准备工作 yolov5环境配置完毕安装pyinstaller&#xff0c;命令为 pip install pyinstallerps: 为了避免可能的错误&#xff0c;所有操作请在英文路径下进行。 1 修改detect_qt5.py或者相关文件 如果是使用我的检测界面的&#xff0c;应该是修改detect_qt5.py这个文件&#x…

全网最低价——组合预测模型全家桶

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

wblogic中间件配置数据源

配置数据源 1.服务-数据源-配置-新建 2.单机选一般数据源 3.选择源名称、jndi名称、数据库类型 4.选择驱动 5.下一步 6.输入连接串信息 参考&#xff1a; 格式二&#xff1a;jdbc:oracle:thin:<host>:<port>:<SID> 数据库名称配置的sid 7.测试配置&#xff…

【AIGC科技展望】预测AIGC2025年的机会与挑战

2025年&#xff0c;AIGC的机会与挑战 在未来的五年里&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;将会成为一个越来越重要的领域。但是&#xff0c;伴随着机会而来的是挑战。在这篇文章中&#xff0c;我们将一起探讨AIGC的机会与挑战&#xff0c;并预测2025…

AI绘图模型不会写字的难题解决了

介绍 大家好&#xff0c;最近有个开源项目比较有意思&#xff0c;解决了图像中不支持带有中文的问题。 https://github.com/tyxsspa/AnyText。 为什么不能带有中文&#xff1f; 数据集局限 Stable Diffusion的训练数据集以英文数据为主&#xff0c;没有大量包含其他语言文本的…

书生·浦语大模型实战1

书生浦语大模型全链路开源体系 视频链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 大模型之所以能收到这么高的关注度&#xff0c;一个重要原因是大模型是发展通用人工智能的重要途径 深度信念网络&#xff1a; &#xff08;1&#xff09;又被称为贝叶斯网…