C++ 日期类的实现

目录

前言

日期类中的成员函数和成员变量 

日期类中成员函数的详解和实现 

1.天数前后的判断

2.天数加减的实现

3.前置++ && 后置++

4.计算天数差值


前言

        日期类的实现将综合前面所学的(类的6个默认成员函数),进一步理解和掌握类的6个默认成员函数。

若对(类的6个成员函数不太理解)请先看前文:

C++ 类与对象(中)-CSDN博客

C++ 类与对象(中)续-CSDN博客


日期类中的成员函数和成员变量 

以下声明都在.h文件中

class Date
{
public://全缺省的构造函数Date(int year = 1, int month = 1, int day = 1);//运算符重载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);//前置++ 后置++Date& operator++();// 特殊处理:解决语法逻辑不自洽,自相矛盾的问题// d1++// 为了跟前置++区分,强行增加一个int形参,够成重载区分Date operator++(int);Date operator--(int);Date& operator--();// 天数-天数int operator-(const Date& d);// 本质就是inline(不声明和定义分离)//判断闰年还是平年int GetMonthDay(int year, int month){assert(month > 0 && month < 13);static int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 365   自转  公转  365 5+h// 366if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return monthDays[month];}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};


日期类中成员函数的详解和实现 

1.天数前后的判断

这是 实现Date 类,对比较运算符 < 的重载定义。它比较两个 Date 对象,如果第一个日期早于第二个日期,则返回 true ,否则返回 false 。

以下是它的工作原理:

1. 它比较两个日期的年份。如果第一个日期的年份小于第二个日期的年份,则返回 true 。

2. 如果年份相等,则比较两个日期的月份。如果第一个日期的月份小于第二个日期的月份,则返回 true 。

3. 如果月份相等,则比较两个日期的天数。如果第一个日期的天数小于第二个日期的天数,则返回 true 。

4. 如果所有比较都为 false,则表示两个日期相等,因此返回 false 。

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

==运算符的实现,== 运算符通过比较 _year 、 _month 和 _day 来实现。如果三个成员变量都相等,则返回 true ,否则返回 false 。

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

<=运算符的实现,在上面我们实现了<和=连个运算符,在实现<=的时候我们就可以调用<和=运算符了。

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

>运算符的实现,在上面我们实现了<=运算符,那么对<=运算符取反就可以了。

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

>=运算符的实现,要得到>=那么我们只需要对<运算符取反。

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

天数前后判断函数的测试:

int main()
{Date d1(2024, 2, 3);Date d2(2024, 2, 1);cout << (d1 > d2) << endl;cout << (d1 < d2) << endl;cout << (d1 >= d2) << endl;cout << (d1 <= d2) << endl;
}


2.天数加减的实现

+=操作的实现,这个函数是 Date 类的成员函数,它将一个给定的天数添加到日期中。

它首先将给定的天数添加到 _day 中。然后,它检查 _day 是否大于该月的总天数。如果大于,则将 _day 减去该月的总天数,并将 _month 增加 1。如果 _month 等于 13,则将 _year 增加 1,并将 _month 重置为 1。

最后,它返回对当前对象的引用。

(注意:这里为什么是实现+=的操作,因为此时_day已经被改变,而+操作是不改变_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;
}

+操作的实现,为了不修改当前对象_day,我们需要创建一个临时变量tmp,最后返回tmp的拷贝,实现+的操作。

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

接下来是-=和-操作的实现。

Date& Date::operator-=(int day)
{_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;
}

天数加减操作的测试:

int main()
{Date d1(2024, 2, 3);Date d2 = d1 + 20;d2.Print();d1.Print();d2 -= 20;d2.Print();d1 += 30000;d1.Print();
}

日期计算器的结果:


3.前置++ && 后置++

前置++:返回+1之后的结果
注意:this指向的对象函数结束后不会销毁,故以引用方式返回提高效率

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

 后置++:
前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载
     C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器 自动传递
     注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存一份,然后给this + 1,而temp是临时对象,因此只能以值的方式返回,不能返回引用

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

前置++ && 后置++的测试:

int main()
{Date d1(2024, 2, 3);++d1;d1.operator++();d1.Print();d1++;//此写法自动识别d1.operator++(0);//这种写法传参帮助编译器识别d1.Print();}


4.计算天数差值

计算两个日期之间的天数差。

首先检查两个日期的大小,并将较大的日期存储在 max 中,将较小的日期存储在 min 中。

然后,它使用一个循环来计算 min 到 max 之间的天数差。

最后,它返回天数差乘以一个标志位,该标志位表示两个日期之间的天数差是正数还是负数。

int Date::operator-(const Date& d)
{int flag = 1;Date max = *this;Date min = d;if (*this < d){int flag = -1;max = d;min = *this;}int n = 0;while (min != max){++min;++n;}return n * flag;
}

计算天数差值函数的测试:

int main()
{Date d1(2024, 2, 3);Date d2(2024, 2, 10);cout << (d2 - d1) << endl;}

距离新年还剩7天了,提前祝大家新年快乐!!!

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

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

相关文章

算法刷题day04

目录 一、前缀和二、子矩阵的和三、激光炸弹四、K倍区间五、总结 一、前缀和 标签&#xff1a;前缀和 题目描述&#xff1a; 输入一个长度为 n 的整数序列。接下来再输入 m 个询问&#xff0c;每个询问输入一对 l,r。对于每个询问&#xff0c;输出原序列中从第 l 个数到第 r…

COX预测模型过程中,我踩过的那些雷

R语言做&#xff01;初学者先进来看看&#xff01;&#xff01;&#xff01; SCI冲 COX分析&#xff1a;做临床信息与预后相关的COX分析大致都会分为两个步骤&#xff0c;先做单因素COX回归分析&#xff0c;再根据P值挑选有意义的变量&#xff0c;最终纳入COX多因素回归模型中&…

20240202在WIN10下部署faster-whisper

20240202在WIN10下部署faster-whisper 2024/2/2 12:15 前提条件&#xff0c;可以通过技术手段上外网&#xff01;^_ 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】800&#xffe5; 2、请正确安装好NVIDIA最…

SpringBoot实战项目第一天

环境搭建 后端部分需要准备&#xff1a; sql数据库 创建SpringBoot工程&#xff0c;引入对应的依赖(web\mybatis\mysql驱动) 配置文件application.yml中引入mybatis的配置信息 创建包结构&#xff0c;并准备实体类 完成今日开发后项目部分内容如下图示 用户注册于登录部分…

[BUUCTF]-PWN:mrctf2020_easy_equation解析

查看保护 再看ida 很明了&#xff0c;题目就是让我们用格式化字符串漏洞修改judge的值&#xff08;可以用python脚本进行计算&#xff0c;最终算出来得2&#xff09;使等式成立&#xff0c;然后getshell。 虽然操作比较简单&#xff0c;但我还是列出了几种方法 解法一&#x…

uni-app移动端图片预览组件 movable-area 、movable-view (支持缩放,拖动效果、替换部分代码图片可直接使用)

UniApp图片预览组件 利用uni-app官方<movable-area>、<movable-view>内置视图组件 配合 uView 组件的u-popup 弹框组件共同实现封装的图片预览组件&#xff0c;支持手指缩放、拖动效果&#xff0c;替换代码中部分图片后 可以直接使用。 效果图&#xff1a; 组件代码…

【数据结构与算法】——单链表的原理及C语言实现

数据结构与算法——链表原理及C语言实现 链表的原理链表的基本属性设计创建一个空链表链表的遍历&#xff08;显示数据&#xff09;释放链表内存空间 链表的基本操作设计&#xff08;增删改查&#xff09;链表插入节点链表删除节点链表查找节点增删改查测试程序 链表的复杂操作…

Vulnhub billu b0x

0x01 环境搭建 1. 从官方下载靶机环境&#xff0c;解压到本地&#xff0c;双击OVF文件直接导入到vmware虚拟机里面。2. 将虚拟机的网络适配器调成NAT模式&#xff0c;然后开机即可进行操作了。 0x02 主机发现 nmap -sn 192.168.2.0/24 成功获取靶机IP为192.168.2.129。 0x0…

本次安装Visual Studio 所用的安装程序不完整。请重新运行VisualStudio安装程序以解决此问题

今天点开VS的时候遇到了这个问题 因为昨天升级到一半电脑关机了&#xff0c;今天打开软件遇到如下错误&#xff0c; 解决办法很简单&#xff0c;找到安装目录进入Installer文件夹 我的目录在C:\Program Files (x86)\Microsoft Visual Studio\Installer 找到vs_installer.exe…

【python】python爱心代码

一、实现效果&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、准备工作 &#xff08;1)、导入必要的模块&#xff1a; 代码首先导入了需要使用的模块&#xff1a;requests、lxml和csv。 import requests from lxml import etree import csv 如果出现…

查找单词-算法(深度优先)

题目 给定一个二维数组与一个单词&#xff0c;数组中每个元素为大写字母&#xff0c;判断单词是否出现在数组中。 如二维数组&#xff1a; char[][] map {{A, B, C, E}, {S, F, C, S}, {A, D, E, E}}; 目标单词&#xff1a; ABCCEE 解题 深度优先&#xff0c;并且走过的…

03哈希表:242、有效的字母异位词

242、有效的字母异位词 文章目录 242、有效的字母异位词方法一&#xff1a;暴力破解法方法二、 哈希法 重点&#xff1a;哈希可以用数组代替表示&#xff0c;下标用与a的位置绝对值 暴力破解法&#xff1a;两层for循环&#xff0c;同时记录字母次数哈希法&#xff1a;第一个字符…

C#写个小工具,把多个word文档进行合并成一个word文档

先要安装包 帮助类WordDocumentMerger&#xff0c;用于处理word合并功能 using System; using System.Collections.Generic; using System.Text; using Microsoft.Office.Interop.Word; using System.Reflection; using System.IO; using System.Diagnostics;namespace WordH…

分别用JavaScript,Java,PHP,C++实现桶排序的算法(附带源码)

桶排序是计数排序的升级版。它利用了函数的映射关系&#xff0c;高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效&#xff0c;我们需要做到这两点&#xff1a; 在额外空间充足的情况下&#xff0c;尽量增大桶的数量使用的映射函数能够将输入的 N 个数据均匀的分…

关闭windows系统的自动更新的6种方法 详细介绍

关闭Windows系统的自动更新可以通过多种方法实现&#xff0c;以下将详细介绍六种不同的方法。请注意&#xff0c;关闭自动更新可能会使您的系统面临安全风险&#xff0c;因为您将不会及时接收到最新的安全补丁和系统更新。在执行以下任何操作之前&#xff0c;请确保您了解潜在的…

多线程读写文件问题

多线程读写同个文件会不会有访问冲突或者异常&#xff1f;我们写个程序来测试一下 /*** Created by fangruibin* 测试多线程读写文件*/#include <iostream> #include <pthread.h> #include <unistd.h> #include <string.h>const char* fileName &quo…

【C语言】字符串函数介绍

目录 前言&#xff1a; 1. strlen 函数 函数介绍 strlen 函数的使用 strlen 函数的模拟实现 2. strcpy 函数 函数介绍 strcpy 函数的使用 strcpy 函数的模拟实现 3. strcat 函数 函数介绍 strcat 函数的使用 strcat 函数的模拟实现 4. strcmp 函数 函数介绍 st…

前端工程化之:webpack1-12(常用扩展)

目录 前言 一、CleanWebpackPlugin 二、HtmlWebpackPlugin 三、CopyPlugin 四、webpack-dev-server 五 、file-loader 六、url-loader 七、路径问题 前言 由于 webpack 、 webpack-cli 、 webpack-dev-server 会存在版本不兼容问题&#xff0c;所以这里使用的版本如下&…

4K Video Downloader forMac/win:畅享高清视频下载的终极利器!

在如今的数字时代&#xff0c;高清视频已经成为人们生活中不可或缺的一部分。无论是观看精彩的电影、音乐视频&#xff0c;还是学习教育类的在线课程&#xff0c;我们都希望能够以最清晰流畅的方式来欣赏。而为了满足这一需求&#xff0c;我们需要一款功能强大的高清视频下载软…

工业平板电脑定制_三防平板电脑安卓主板厂家

工业平板电脑具有IP68级三防品质&#xff0c;采用高强度工业材质制造&#xff0c;结构稳固坚韧&#xff0c;具备较高的抗冲击和防震能力。隔空减震技术进一步加强了产品的抗冲击和防震动功能。广泛应用于工控、医疗、电信、电力、工业自动化设备、汽车检测、制造业等多个领域&a…