C++_实现日期类

✨✨ 欢迎大家来到小伞的大讲堂✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:C++学习
小伞的主页:xiaosan_blog

1.日期类的实现接口(date.h)

对于多次调用的函数,我们会实现在头文件中,以提高效率(我会包含在其次标题中); 

class Date

{

public:

// 获取某年某月的天数

int GetMonthDay(int year, int month);

  // 全缺省的构造函数

Date(int year = 1900, int month = 1, int day = 1);

  // 拷贝构造函数

// d2(d1)

Date(const Date& d);

  // 赋值运算符重载

// d2 = d3 -> d2.operator=(&d2, d3)

Date& operator=(const Date& d);

  // 析构函数

~Date();

  // 日期+=天数

Date& operator+=(int day);

  // 日期+天数

Date operator+(int day);

  // 日期-天数

Date operator-(int day);

   // 日期-=天数

Date& operator-=(int day);

  // 前置++

Date& operator++();

  // 后置++

Date operator++(int);

  // 后置--

Date operator--(int);

  // 前置--

Date& operator--();

  // >运算符重载

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

  // 日期-日期 返回天数

int operator-(const Date& d);

private:

int _year;

int _month;

int _day;

};

1.1 GetMonthDay

int GetMonthDay(int year, int month)
{

    //静态变量
    static int monthDayArray[13] = { -1, 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;
    }
    return monthDayArray[month];
}

1.2 swap

注:在往后的C++使用中,多以引用代替指针,以防对NULL指针的解引用 

1.2.1 Date类的交换函数 

void swap(Date& A) {Date tmp = *this;*this = A;A = *this;
}

 1.2.2 年月日的交换函数

void swap(int* x, int* y) {int tmp = *x;*x = *y;*y = tmp;
}

2.日期类的实现接口(date.cpp)

获取某年某月的天数 

Date::Date(int year, int month, int day) {_year = year;_month = month;_day = day;
}

年月日的打印

void Date::Print() {cout << _year << '/' << _month << '/' << _day << endl;
}

2.1 重载运算符(operate)

2.1.1 operate+=

//+=
Date& Date::operator+=(int day) {_day += day;//当day大于该月的日期while (_day>GetMonthDay(_year,_month)) {_day -= GetMonthDay(_year, _month);_month++;//判断是否大于12月if (_month = 13) {_year++;_month = 1;}}return *this;
}

2.1.2 operate+

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

2.1.3 operate<(<=,>,>=以此类推)

 bool Date::operator<(const Date& d) {if (_year > d._year) {return false;}if (_year < d._year) {return true;}if (_month > d._month) {return false;}if (_month < d._month) {return true;}if (_day >= d._day) {return false;}else {return true;}
}

2.1.4 operate-=

Date& Date::operator-=(int day)
{//如果day为负号,则+=或者+if (day < 0){return *this += (-day);}//先减值_day -= day;while (_day <= 0){--_month;//防止month过0if (_month == 0){_month = 12;--_year;}//先-month是因为取天数,是在上个月中取,并非当前月_day += GetMonthDay(_year, _month);}return *this;
}

2.1.5 operate-

int Date::operator-(const Date& d) {int y1, m1, d1, y2, m2, d2;int arr[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };y1 = this->_year;m1 = this->_month;d1 = this->_day;y2 = d._year;m2 = d._month;d2 = d._day;int sum2 = 0;int sum1 = 0;if (y1 < y2) {swap(&y1, &y2);swap(&m1, &m2);swap(&d1, &d2);}if (y1 == y2) {if (m1 < m2) {swap(&m1, &m2);swap(&d1, &d2);}}if (y1 == y2) {if (m1 == m2) {if (d1 < d2) {swap(&d1, &d2);}}}//差的年数int x = y1 - y2;//记录2年的天数if (((y2 % 4 == 0) && (y2 % 100 != 0)) || y2 % 400 == 0) {//判断是否为闰年arr[1] = 29;}for (int i = 0; i < m2 - 1; i++) {sum2 += arr[i];}sum2 += d2;//记录1年的天数if (((y1 % 4 == 0) && (y1 % 100 != 0)) || y1 % 400 == 0) {//判断是否为闰年arr[1] = 29;}for (int i = 0; i < m1 - 1; i++) {sum1 += arr[i];}sum1 += d1;for (int i = 0; i < x; i++) {if (((y1 % 4 == 0) && (y1 % 100 != 0)) || y1 % 400 == 0) {sum1 += 366;}else {sum1 += 365;}}return sum1 - sum2;
}

2.2 拷贝构造

因为其内部没有空间的开辟,所以编译器默认的拷贝构造(浅拷贝)也可以使用

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

总结:

date.h

#pragma once#include<iostream>
using namespace std;
#include<assert.h>class Date
{
public:Date(int year = 1900, int month = 1, int day = 1);void Print();int GetMonthDay(int year, int month){static int monthDayArray[13] = { -1, 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;}return monthDayArray[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);void swap(Date& A) {Date tmp = *this;*this = A;A = *this;}int getDays(const Date& d);void swap(int* x, int* y) {int tmp = *x;*x = *y;*y = tmp;}Date(const Date& d);
private:int _year;int _month;int _day;
};

date.cpp

#define _CRT_SECURE_NO_WARNINGS
#include"date.h"Date::Date(int year, int month, int day) {_year = year;_month = month;_day = day;
}void Date::Print() {cout << _year << '/' << _month << '/' << _day << endl;
}//+=
Date& Date::operator+=(int day) {_day += day;//当day大于该月的日期while (_day>GetMonthDay(_year,_month)) {_day -= GetMonthDay(_year, _month);_month++;//判断是否大于12月if (_month = 13) {_year++;_month = 1;}}return *this;
}Date Date::operator+(int day) {Date tmp = *this;tmp += day;//operator+=(int day)return tmp;
}bool Date::operator<(const Date& d) {if (_year > d._year) {return false;}if (_year < d._year) {return true;}if (_month > d._month) {return false;}if (_month < d._month) {return true;}if (_day >= d._day) {return false;}else {return true;}
}bool Date::operator>(const Date& d) {if (_year < d._year) {return false;}if (_year > d._year) {return true;}if (_month < d._month) {return false;}if (_month > d._month) {return true;}if (_day <= d._day) {return false;}else {return true;}}bool Date::operator>=(const Date& d) {if (_year < d._year) {return false;}if (_year > d._year) {return true;}if (_month < d._month) {return false;}if (_month > d._month) {return true;}if (_day < d._day) {return false;}else {return true;}}bool Date::operator<=(const Date& d) {if (_year > d._year) {return false;}if (_year < d._year) {return true;}//year相同if (_month > d._month) {return false;}if (_month < d._month) {return true;}//month相同if (_day >= d._day) {return false;}else {return true;}}bool Date::operator==(const Date& d) {return _year == d._year && _month == d._month && _day == d._day;}bool Date::operator!=(const Date& d) {Date tmp = *this;return !(tmp == d);}Date Date::operator-(int day) {Date tmp = *this;tmp -= day;return tmp;}Date& Date::operator-=(int day){//如果day为负号,则+=或者+if (day < 0){return *this += (-day);}//先减值_day -= day;while (_day <= 0){--_month;//防止month过0if (_month == 0){_month = 12;--_year;}//先-month是因为取天数,是在上个月中取,并非当前月_day += GetMonthDay(_year, _month);}return *this;}int Date::operator-(const Date& d) {int y1, m1, d1, y2, m2, d2;int arr[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };y1 = this->_year;m1 = this->_month;d1 = this->_day;y2 = d._year;m2 = d._month;d2 = d._day;int sum2 = 0;int sum1 = 0;if (y1 < y2) {swap(&y1, &y2);swap(&m1, &m2);swap(&d1, &d2);}if (y1 == y2) {if (m1 < m2) {swap(&m1, &m2);swap(&d1, &d2);}}if (y1 == y2) {if (m1 == m2) {if (d1 < d2) {swap(&d1, &d2);}}}//差的年数int x = y1 - y2;//记录2年的天数if (((y2 % 4 == 0) && (y2 % 100 != 0)) || y2 % 400 == 0) {//判断是否为闰年arr[1] = 29;}for (int i = 0; i < m2 - 1; i++) {sum2 += arr[i];}sum2 += d2;//记录1年的天数if (((y1 % 4 == 0) && (y1 % 100 != 0)) || y1 % 400 == 0) {//判断是否为闰年arr[1] = 29;}for (int i = 0; i < m1 - 1; i++) {sum1 += arr[i];}sum1 += d1;for (int i = 0; i < x; i++) {if (((y1 % 4 == 0) && (y1 % 100 != 0)) || y1 % 400 == 0) {sum1 += 366;}else {sum1 += 365;}}return sum1 - sum2;}Date::Date(const Date& d) {_year = d._year;_month = d._month;_day = d._day;}

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

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

相关文章

免杀笔记 ---> 一种有想法的Indirect-Syscall

今天来分享一下&#xff0c;看到的一种Indirect-Syscall&#xff0c;也是两年前的项目了&#xff0c;但是也是能学到思路&#xff0c;从中也是能感受到杀软对抗之间的乐趣&#xff01;&#xff01;说到乐趣&#xff0c;让我想起看到过一位大佬的文章对"游褒禅山记"的…

Spring Boot电商开发:购物商城系统

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…

算法-Init

&#xff08;1&#xff09;有限性&#xff08;Finiteness&#xff09;&#xff1a;算法必 需在有限步骤内结束&#xff1b; &#xff08;2&#xff09;确定性&#xff08;Definiteness&#xff09;&#xff1a;算法的每一个步骤必须清晰无歧义地定义&#xff1b; &#xff08;3…

基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue

基于GIKT深度知识追踪模型的习题推荐系统 目录结构 Flask-BackEnd flask后端 app 后端主体文件 alg 深度学习模块 data 数据集data_process.py 数据预处理gikt.py GIKT模型pebg.py PEBG模型params.py 一些参数train.py 仅模型训练train_test.py 模型训练和测试-五折交叉验证t…

51单片机-AD(模拟信号转数字信号)-实验(电压采集)

介绍AD AD转换&#xff08;Analog to Digital Conversion&#xff0c;模数转换&#xff09;是将连续的模拟信号转换为离散的数字信号的过程。这个过程在各种电子设备中都非常重要&#xff0c;特别是在涉及传感器、音频信号、视频信号等需要进行数字化处理的领域。 个人理解&a…

《深度学习》ResNet残差网络、BN批处理层 结构、原理详解

目录 一、关于ResNet 1、什么是ResNet 2、传统卷积神经网络存在的问题 1&#xff09;梯度消失和梯度爆炸问题 2&#xff09;训练困难 3&#xff09;特征表示能力受限 4&#xff09;模型复杂度和计算负担 3、如何解决 1&#xff09;解决梯度问题 BN层重要步骤&#xff1a; 2…

mqtt网关数据接入rabbitmq,缓存离线数据,实现消息保留

应用场景&#xff1a;网关将设备数据发布至mqtt服务器后&#xff0c;数采程序因为重启或者升级等原因&#xff0c;未能接到到离线的订阅消息&#xff0c;利用rabbitmq-mqtt可将离线数据缓存&#xff0c;待上线后接收 启用mqtt插件 rabbitmq-plugins enable rabbitmq_mqtt

C++:STL详解(二)string类的模拟实现

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; &#x1f525;&#x1f525;&#x1f525;&#x1f525;&#x1f525;本文参考文章&…

【HarmonyOS】深入理解@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

【HarmonyOS】深入理解Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 前言 之前就Observed和ObjectLink写过一篇讲解博客【HarmonyOS】 多层嵌套对象通过ObjectLink和Observed实现渲染更新处理&#xff01; 其中就Observe监听类的使用&#xff0c;Object…

【Linux 报错】vim 保存文件时出现 E45: ‘readonly‘ option is set (add ! to override)

一、错误原因 该错误表明当前你尝试保存的是一个 只读文件&#xff0c;该文件权限设置为只读&#xff0c;具有只读的标识 系统为了防止你意外修改该只读文件&#xff0c;因此会阻止对只读文件的保存&#xff08;他怕你修改了你还保存&#xff0c;破坏了只读属性&#xff09; …

【Linux扩容根分区】LVM分区扩容过程踩坑记录

最近想要给自己使用的Linux操作系统的根分区进行扩容&#xff0c;解决完发现&#xff0c;原来问题如此简单。 特此记录&#xff0c;希望能帮助到有需要的人。 通过df -Th查看系统磁盘分区情况 通过vgdisplay 查看内容 实操过程中&#xff0c;原来红框中&#xff0c;Free PE …

变电站设备检测系统源码分享

变电站设备检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

webview2加载本地页面

加载方式 通过导航到文件 URL 加载本地内容 使用方式&#xff1a; webView->Navigate( L"file:///C:/Users/username/Documents/GitHub/Demos/demo-to-do/index.html"); 但是这种方式存在一些问题&#xff0c;比如&#xff1a; 存在跨域问题&#xff08;我加载…

RocketMQ 常用命令mqadmin与控制面板

使⽤发送和接收消息验证MQ 验证生产者&#xff1a; 配置 nameserver 的环境变量 &#xff0c;在发送/ 接收消息之前&#xff0c;需要告诉客户端 nameserver 的位置。配置环境变量 NAMESRV_ADDR &#xff1a; vim /etc/profileexport NAMESRV_ADDR"192.168.136.66:9876;1…

【网络安全】网络基础第一阶段——第一节:网络协议基础---- OSI与TCP/IP协议

从今天起&#xff0c;我们正式进入第二部分——网络基础。继续学习网络基础、网络协议等相关内容&#x1f31f;&#x1f31f;&#x1f31f; 目录 一、OSI模型 1.1 分层思想 1.2 OSI参考模型 1.3 数据封装与解封装 1.3.1 数据的封装过程 1.3.2 数据的解封装过程 二、TCP/…

探索C语言与Linux编程:获取当前用户ID与进程ID

探索C语言与Linux编程:获取当前用户ID与进程ID 一、Linux系统概述与用户、进程概念二、C语言与系统调用三、获取当前用户ID四、获取当前进程ID五、综合应用:同时获取用户ID和进程ID六、深入理解与扩展七、结语在操作系统与编程语言的交汇点,Linux作为开源操作系统的典范,为…

2025年第十届智能信息技术国际会议 (ICIIT 2025)即将召开!

第10届智能信息技术国际会议&#xff08;ICIIT 2025&#xff09;将于2025年2月20日至23日在越南河内举行。ICIIT系列会议将每年举行&#xff0c;为智能信息技术及相关领域提供互动论坛&#xff0c;除了越南的研究人员外&#xff0c;会议小组还欢迎来自世界各地的有兴趣与该地区…

【在Linux世界中追寻伟大的One Piece】进程间通信

目录 1 -> 进程间通信介绍 1.1 -> 进程间通信目的 1.2 -> 进程间通信发展 1.3 -> 进程间通信分类 1.3.1 -> 管道 1.3.2 -> System V IPC 1.3.3 -> POSIX IPC 2 -> 管道 2.1 -> 什么是管道 2.2 -> 匿名管道 2.3 -> 实例代码 2.4 -…

JavaScript typeof运算符

在js中可以typeof来做到确定一个值到底是什么类型。 <script>var num 100;//数值类型var name "mingzi";//字符串类型var book true;//布尔类型var student {name: " 小明",age: 16,tnum: "213444"}//对象是由多个数据组合而成&#x…

[NewStarCTF 2023 公开赛道]Begin of PHP1

开始代码审计. <?php error_reporting(0); highlight_file(__FILE__);if(isset($_GET[key1]) && isset($_GET[key2])){echo "Level 1<br>";if($_GET[key1] ! $_GET[key2] && md5($_GET[key1]) md5($_GET[key2])){$flag1 True;}else{die(…