【C++基础】实现日期类

👻内容专栏: C/C++编程
🐨本文概括: C++实现日期类。
🐼本文作者: 阿四啊
🐸发布时间:2023.9.7
对于类的成员函数的声明和定义,我们在类和对象上讲到过,需要进行声明和定义分离。
一些需要使用的接口函数声明,我们放入到Date.h文件中
#include <iostream>
using namespace std;class Date
{public://构造函数Date(int year = 1, int month = 1, int day = 1);//拷贝构造函数Date(const Date& d);//析构函数//~Date(); //日期类可以不写//打印日期void Print()const;//运算符重载bool operator<(const Date& d) const;bool operator==(const Date& d) const;bool operator<=(const Date& d) const;bool operator>(const Date& d) const;bool operator>=(const Date& d) const;bool operator!=(const Date& d) const;//赋值运算符重载Date& operator=(const Date& d);//日期+= 天数Date& operator+=(int day);//日期 + 天数Date operator+(int day) const;//日期 -= 天数Date& operator-=(int day);//日期 - 天数Date operator-(int day) const;//获取当月天数int GetMonthDay(int year, int month) const;//前置++Date& operator++();//后置++Date operator++(int);//前置--Date& operator--();//后置--Date operator--(int);//日期 - 日期 返回天数int operator-(const Date& d) const;private:int _year;int _month;int _day;
};
🤗🤗下面,我们对一些日期接口函数的实现:
实现于Date.cpp文件中
一、构造函数、拷贝构造以及日期的打印
#include "date.h"
//构造函数
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;//检查日期是否合法if (month < 1 || month > 12 || day < 1 || day > GetMonthDay(year, month)){cout << "非法日期" << endl;//exit(-1);}
}
Date::Date(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;
}
//Date::~Date()
//{
// cout << "~Date()" << endl;
//}
void Date::Print() const
{cout << _year << "年" << _month << "月" << _day << "日" << endl;
}
二、赋值运算符重载函数
//赋值运算符重载
Date& Date::operator=(const Date& d)
{if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;
}
三、运算符重载
比较运算符重载
我们写一个operator< 运算符重载函数和一个 operator== 运算符重载函数即可,其他直接复用就行。
bool Date::operator<(const Date& d) const
{if (_year < d._year){return true;}else if(_year == d._year && _month < d._month){return true;}else if (_year == d._year && _month == d._month && _day < d._day){return true;}else{return false;}
}
bool Date::operator==(const Date& d) const
{return _year == d._year && _month == d._month&& _day == d._day;
}
bool Date::operator<=(const Date& d) const
{return (*this < d) || (*this == d);
}
bool Date::operator>(const Date& d) const
{return !(*this <= d);
}
bool Date::operator>=(const Date& d) const
{return (*this > d) || (*this == d);
}
bool Date::operator!=(const Date& d) const
{return !(*this == d);
}
日期 ± 天数、日期 - 日期
获取当前月份的天数
首先我们需要写一个获取当月的天数GetMonthDay()函数,以便于后面用日期 ± 天数运算。
//获取当月天数
int Date::GetMonthDay(int year, int month) const
{static int MonthDayArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//判断是否为闰年(先判断是否为2月)if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 4 == 0))){return 29;}return MonthDayArray[month];
}
日期 += 天数 与 日期 + 天数
//日期+= 天数
Date& Date::operator+=(int day)
{if (day < 0){return *this -= -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) const
{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)
//{
// *this = *this + day;
// return *this;
//}

日期 -= 天数 与 日期 - 天数
我们知道了先写operator+=,再写operator+直接复用即可这种方法更优,所以我们日期减去天数也是实现operator-=,再实现operator-
//日期 -= 天数
Date& Date::operator-=(int day)
{if (day < 0){return *this += -day;}_day -= day;while (_day <= 0){_month--;if (_month == 0){_year--;_month = 12;}_day += GetMonthDay(_year, _month);}return *this;
}//日期 - 天数
Date Date::operator-(int day) const
{Date tmp(*this);tmp -= day;return tmp;
}
自增 和 自减 重载
C++规定:前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载,后置++重载时多增加了一个int类型的参数,与前置++构成函数重载,以区分前置++
//前置++
Date& Date::operator++()
{*this += 1;//返回++之后的值return *this;
}
//后置++
Date Date::operator++(int)
{Date tmp(*this);//返回++之前的值*this += 1;return tmp;
}//前置--
Date& Date::operator--()
{*this -= 1;return *this;
}
//后置--
Date Date::operator--(int)
{Date tmp(*this);*this -= 1;return tmp;
}
日期 - 日期
// d1 - d2
int Date::operator-(const Date& d) const
{//默认认为左边日期大Date max = *this;Date min = d;int flag = 1;//为1返回正数,-1返回负数int count = 0;//统计天数//不成立则交换if (*this < d){max = d;min = *this;flag = -1;}//while(min < max)while (min != max){min++;count++;}return count * flag;
}
四、全局函数实现流插入流提取
date.h 流插入流提取重载函数的声明
/*不能重载成成员函数,否则会导致参数不匹配,因为this指针永远占据第一个位置,无法进行流插入提取操作。*/
//流插入
ostream& operator<<(ostream& out, const Date& d);
//流提取
istream& operator>>(istream& in, Date& d);
如果重载成成员函数,那么成员函数的第一个参数永远是隐藏的this指针,成员函数中只能利用out << _year << _month << _day的顺序,但是在调用时, (d1为日期类对象)d1 << cout,只能这么写,虽然可以,但是很别扭,不符合使用习惯和价值。所以我们需要实现成全局函数才可以。

但是写成全局函数会访问类的成员变量,我们可以利用友元或者将成员变量封装成成员函数解决。
date.cpp 流插入流提取重载函数的实现
/*不能重载成成员函数,否则会导致参数匹配,因为this指针永远占据第一个位置,无法进行流插入提取操作。*/
//涉及访问私有成员变量可以利用友元,或者将成员变量封装成Get成员函数
//流插入
ostream& operator<<(ostream& out, const Date& d)
{out << d._year << "年" << d._month << "月" << d._day << "日" << endl;return out;
}
//流提取
istream& operator>>(istream& in, Date& d)
{in >> d._year >> d._month >> d._day;
}
相关文章:
【C++基础】实现日期类
👻内容专栏: C/C编程 🐨本文概括: C实现日期类。 🐼本文作者: 阿四啊 🐸发布时间:2023.9.7 对于类的成员函数的声明和定义,我们在类和对象上讲到过,需要进行…...
C语言程序设计—通讯录实现
本篇文章主要是实现一个简易的通讯录: 功能如下: 添加用户修改用户删除用户查找用户(可重名)按名字或年龄排序显示用户保存通讯录日志追加 有如下知识点: 动态数组结构体枚举自定义标识符和宏文件打开与存储函数指针…...
实战:大数据Flink CDC同步Mysql数据到ElasticSearch
文章目录 前言知识积累CDC简介CDC的种类常见的CDC方案比较 Springboot接入Flink CDC环境准备项目搭建 本地运行集群运行将项目打包将包传入集群启动远程将包部署到flink集群 写在最后 前言 前面的博文我们分享了大数据分布式流处理计算框架Flink和其基础环境的搭建,…...
B-Tree 索引和 Hash 索引的对比
分析&回答 B-Tree 索引的特点 B-tree 索引可以用于使用 , >, >, <, < 或者 BETWEEN 运算符的列比较。如果 LIKE 的参数是一个没有以通配符起始的常量字符串的话也可以使用这种索引。 有时,即使有索引可以使用,MySQL 也不使用任何索引。…...
入门Python编程:了解计算机语言、Python介绍和开发环境搭建
文章目录 Python入门什么是计算机语言1. 机器语言2. 符号语言(汇编)3. 高级语言 编译型语言和解释型语言1. 编译型语言2. 解释型语言 Python的介绍Python开发环境搭建Python的交互界面 python学习专栏python基础知识(0基础入门)py…...
深度解析Redisson框架的分布式锁运行原理与高级知识点
推荐阅读 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 史上最全文档AI绘画stablediffusion资料分享 AI绘画关于SD,MJ,GPT,SDXL百科全书 AI绘画 stable…...
C#扩展方法
参数列表中this的这种用法是在.NET 3.0之后新增的一种特性---扩展方法。通过这个属性可以让程序员在现有的类型上添加扩展方法(无需创建新的派生类型、重新编译或者以其他方式修改原始类型)。 扩展方法是一种特殊的静态方法,虽然是静态方法&a…...
uniapp 高度铺满全屏
问题:在有uni-tabbar的情况下,页面铺满剩下的部分 <template><view :style"{height:screenHeightpx}" class"page"></view> </template> <script>export default {data() {return {screenHeight: &q…...
UG\NX二次开发 判断向量在指定的公差内是否为零,判断是否是零向量 UF_VEC3_is_zero
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 判断向量在指定的公差内是否为零,判断是否是零向量 UF_VEC3_is_zero 效果: 代码: #include "me.hpp"void ufusr(char* param, int* retco…...
2023年MySQL实战核心技术第一篇
目录 四 . 基础架构:一条SQl查询语句是如何执行的? 4.1 MySQL逻辑架构图: 4.2 MySQL的Server层和存储引擎层 4.2.1 连接器 4.2.1.1 解释 4.2.1.2 MySQL 异常重启 解决方案: 4.2.1.2.1. 定期断开长连接: 4.2.1.2.2. 初始…...
hivesql执行过程
语法解析 SemanticAnalyzer SemanticAnalyzer是Hive中的语义分析器,负责检查Hive SQL程序的语义是否正确。SemanticAnalyzer会对Hive SQL程序进行以下检查: 检查过程 语法检查 SemanticAnalyzer会检查Hive SQL程序的语法是否正确,包括关…...
C语言学习:8、深入数据类型
数据超过类型规定的大小怎么办 C语言中,如果需要用的整数大于int类型的最大值了怎么办? 我们知道int能表示的最大数是2147483647,最小的数是-2147483648,为什么? 因为字32位系统中,寄存器是32位的&#…...
生成树协议 STP(spanning-tree protocol)
一、STP作用 1、消除环路:通过阻断冗余链路来消除网络中可能存在的环路。 2、链路备份:当活动路径发生故障时,激活备份链路,及时恢复网络连通性。 二、STP选举机制 1、目的:找到阻塞的端口 2、STP交换机的角色&am…...
【LeetCode】312.戳气球
题目 有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和…...
商业数据分析概论
🐳 我正在和鲸社区参加“商业数据分析训练营活动” https://www.heywhale.com/home/competition/6487de6649463ee38dbaf58b ,以下是我的学习笔记: 学习主题:波士顿房价数据快速查看 日期:2023.9.4 关键概念/知识点&…...
Golang GUI框架
Golang GUI框架fyne fyne简介第一个fyne应用fyne应用程序和运行循环fyne更新GUI内容fyne窗口处理fyne解决中文乱码问题fyne应用打包fyne画布和画布对象fyne容器和布局fyne绘制和动画fyne盒子布局fyne网格grid布局fyne网格包裹布局fyne边框布局fyne表单布局fyne中心布局fyne ma…...
LeetCode刷题笔记【24】:贪心算法专题-2(买卖股票的最佳时机II、跳跃游戏、跳跃游戏II)
文章目录 前置知识122.买卖股票的最佳时机II题目描述贪心-直观写法贪心-优化代码更简洁 55. 跳跃游戏题目描述贪心-借助ability数组贪心-只用int far记录最远距离 45.跳跃游戏II题目描述回溯算法贪心算法 总结 前置知识 参考前文 参考文章: LeetCode刷题笔记【23】…...
游戏出现卡顿有哪些因素
一、服务器CPU内存占用过大会导致卡顿,升级CPU内存或者优化自身程序占用都可以解决。 二、带宽跑满导致卡,可以升级带宽解决。 二、平常不卡,有大型的活动的时候会卡,这方面主要是服务器性能方面不够导致的,性能常说…...
学习Bootstrap 5的第八天
目录 加载器 彩色加载器 实例 闪烁加载器 实例 加载器大小 实例 加载器按钮 实例 分页 分页的基本结构 实例 活动状态 实例 禁用状态 实例 分页大小 实例 分页对齐 实例 面包屑(Breadcrumbs) 实例 加载器 彩色加载器 在 Bootstr…...
vue中自定义指令
什么是指令 在Vue.js中,指令是一种特殊的 token,用于在模板中以声明式方式将响应式数据绑定到 DOM 元素上,从而实现与 DOM 元素的交互和操作。指令以 “v-” 前缀开始,后跟指令的名称,例如 v-model、v-bind 和 v-on。…...
【YOLO目标检测全栈实战】33 模型部署的终极形态:ONNX Runtime + TensorRT EP 跨平台推理
还记得上周帮一家做边缘计算盒子的客户调优时,他们遇到一个典型问题:同一份ONNX模型,在Windows服务器上用TensorRT跑出了5ms的推理延迟,可部署到客户的ARM工控机上,却只能用CPU硬扛,延迟直接飙到80ms。 客户老板当场拍桌子:“你们这模型是不是分三六九等?”我拆开部署…...
Figma中文汉化终极指南:3分钟实现高效专业设计界面
Figma中文汉化终极指南:3分钟实现高效专业设计界面 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而烦恼吗?作为中文设计师,你…...
STM32 HAL库设计解析:从GPIO到外设的面向对象编程实践
1. 项目概述:从寄存器操作到HAL API的思维跃迁如果你是从标准外设库(SPL)或者更早的寄存器直接操作时代过来的STM32开发者,第一次接触HAL库时,可能会觉得有点“绕”。为什么一个简单的引脚翻转,不再是对GPI…...
高途CFO沈楠辞职 高级副总裁罗斌晋升为首席运营官
雷递网 乐天 5月15日高途(NYSE: GOTU)日前宣布管理层调整。高途称,公司CFO沈楠由于个人原因已递交辞呈,2026年5月31日生效。沈楠辞职后三个月内继续担任公司顾问,以确保平稳过渡。高途战略主管徐步青将负责公司资本市场相关事宜,高…...
【限时技术白皮书】ElevenLabs藏文模型权重结构首度曝光:Transformer Decoder层中Tibetan Syllable Tokenization模块详解
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs藏文语音生成技术全景概览 ElevenLabs 作为全球领先的文本到语音(TTS)平台,目前尚未官方支持藏文(བོད་སྐད་)语音合成。其公…...
5步掌握Mac视频预览革命:QLVideo让你的Finder变身全能播放器
5步掌握Mac视频预览革命:QLVideo让你的Finder变身全能播放器 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://…...
烟草叶部病害-目标检测数据集(包括VOC格式、YOLO格式)
烟草叶部病害-目标检测数据集(包括VOC格式、YOLO格式) 数据集(文章最后关注公众号获取数据集): 链接: https://pan.baidu.com/s/1-4LCiMULEf7OT9JHzL38BQ?pwdytbu 提取码: ytbu 数据集信息介绍: 共有 156…...
BepInEx启动失败完整指南:从IL2CPP兼容性到游戏正常运行
BepInEx启动失败完整指南:从IL2CPP兼容性到游戏正常运行 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx作为Unity游戏插件框架,在IL2CPP编译模式下…...
syncpack 迁移指南:从 v13 到 v14 的完整步骤与注意事项
syncpack 迁移指南:从 v13 到 v14 的完整步骤与注意事项 【免费下载链接】syncpack Consistent dependency versions in large JavaScript Monorepos. 项目地址: https://gitcode.com/gh_mirrors/sy/syncpack syncpack 是一款专为大型 JavaScript Monorepo 设…...
路由器市场新机遇:从硬件到场景化解决方案的演进
1. 项目概述:一个被低估的“家门口”战场聊到路由器,很多人的第一反应可能是“运营商送的”、“能用就行”。确实,在过去很长一段时间里,家用Wi-Fi设备是一个典型的“黑盒”产品,用户对其性能、功能和体验的感知非常模…...
