【C++】类和对象4:日期类的实现(成员函数+运算符重载)

前言

之前我们已经学习了四个默认成员函数(构造、析构、拷贝构造、运算符重载)
今天我们就来尝试用已经学到的知识进行日期类的完整实现

提示:
依然是分成三个文件来写 只是在讲解的时候就不区分文件了 完整的代码在文章最后

并且之前文章中提到的知识在此不会再详细介绍

Date类创建

//对类的成员变量和函数进行声明
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);private:int _year;int _month;int _day;
};

构造函数

//一个简单的构造函数
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;//_year _month _day前加不加this->都可以 加上只是为了方便理解
}

比较功能

==

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

<

比较大小 可以看看其中的逻辑 其他没啥需要强调的

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

<=

有了<和==的重载 我们先来看看<=的重载能不能用上前二者

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

!=

那就是==的逻辑取反

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

运算功能

辅助函数

创建一个函数用于辅助计算

	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 };if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return monthDays[month];}

类+=天数

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原本不存在 是新创建的//相当于 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;
}

类前置++

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

类后置++

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

类-类

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

输入输出

对于输入输出

cpp规定
成员函数的重载,this是第一个参数,所以Date自动成为第二个参数,所以他就只能是左操作数了

我们可以写成全局函数 但是不行的因为成员变量是私有的 无法访问

输出(流插入)

我们可以用友元函数来解决这个问题 详见另一篇文章

代码如下

//在类里面声明
friend ostream& operator<<(ostream& out, const Date& d);//在类外面实现
ostream& operator<<(ostream& out, const Date& d)
{out << d._year << "年" <<d._month << "月" << d._day << "日" << endl;return out;
}

对于流插入的详细介绍到后期再详细介绍 现在只是了解即可

输入(流提取)

friend istream& operator>>(istream& out,  Date& d);
//d不加constistream& operator>>(istream& out,  Date& d)
{cout << "输入年月日" << endl;in << d._year << d._month << d._day;return in;
}

检查

实现一个check函数来检查输入的日期是否合法

//用于构造函数和流提取中
bool CheckInvalid()
{if(_year <= 0 || _month < 1 || _month > 12 || _day < 1 || _day > GetMonthDay(_year, _month))return false;
}

结语

关于日期类的简单实现到这里就结束了 属于是综合了前面的众多知识 还是需要好好消化一番的 希望对你有帮助 我们下次见~~

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

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

相关文章

【Git教程】(一)基本概念 ——工作流、分布式版本控制、版本库 ~

Git教程 基本概念 1️⃣ 为什么要用 Git2️⃣ 为什么要用工作流3️⃣ 分布式版本控制4️⃣ 版本库5️⃣ 简单的分支创建与合并&#x1f33e; 总结 在本章中&#xff0c;将介绍一个分布式版本控制系统的设计思路&#xff0c;以及它与集中式版本控制系统的不同之处。除此之外&am…

未来之梦:畅想人工智能操控手机的辉煌时代

引言&#xff1a; 在当今数字化快速发展的时代&#xff0c;人工智能技术正日益深入我们的生活。其中&#xff0c;手机作为人们日常生活不可或缺的一部分&#xff0c;其未来将如何受到人工智能技术的影响&#xff0c;引发了广泛的关注和研究。本文将深入探讨人工智能操控手机的…

区块链大解码:深入了解Web3的核心技术

随着技术的迅速发展&#xff0c;Web3正逐渐崭露头角&#xff0c;成为数字时代的引领者。其中&#xff0c;区块链技术作为Web3的核心&#xff0c;扮演着至关重要的角色。本文将深入解码区块链技术&#xff0c;探讨其在Web3时代的关键作用以及未来发展趋势。 1. 区块链基础原理 …

Windows 10 配置 FFmpeg 使用环境

Windows 10 配置 FFmpeg 使用环境 1.下载FFmpeg 的windows办2. 配置环境变量:3.查看是否配置正确 cmd 或者 PowerShell 执行以下命令 1.下载FFmpeg 的windows办 GitHub 地址 :https://github.com/BtbN/FFmpeg-Builds/releases 解压后得到如图: 2. 配置环境变量: 复制路径:…

java SpringBoot2.7整合Elasticsearch(ES)7 进行文档增删查改

首先 我们在 ES中加一个 books 索引 且带有IK分词器的索引 首先 pom.xml导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>applicatio…

CMake编译JSONCPP库

第一、 JSONCPP 是一个开源的 C 库&#xff0c;用于处理 JSON 数据的解析和生成。您可以在 JSONCPP 的官方网站&#xff08;https://github.com/open-source-parsers/jsoncpp&#xff09;上找到该库的源代码和相关文档。 要使用 JSONCPP&#xff0c;您需要按照以下步骤进行操作…

基于A-Star搜索算法的迷宫小游戏的设计

这篇文章是作者人工智能导论课的大作业&#xff0c;发出来供大家学习参考&#xff08;有完整代码&#xff09;。想要论文WORD文件的可以在本文资源处下载&#xff08;可能还在审核&#xff09;。 摘要&#xff1a; 本文章聚焦于基于A-Star搜索算法的迷宫小游戏设计&#xff0c;…

踩坑实录(Second Day)

作为公司的小菜鸟&#xff0c;每天都踩坑应该是一件很正常的事情吧&#xff0c;哈哈哈。今天遇到了比较棘手的问题&#xff0c;以前从来没有遇到过。然后就是在某平台上接的一个 bug 修改的单子&#xff0c;也拿出来和大家分享一下~ 此为第二篇&#xff08;2024 年 02 月 05 日…

【线程】FutureTask vs. CompletableFuture:解锁异步编程的不同层次(1)

在Java的多线程编程中&#xff0c;FutureTask 和 CompletableFuture 是两个关键的工具&#xff0c;分别代表了基础和进阶的异步编程技术。本文将深入介绍这两者的特点、使用方法以及它们之间的巧妙应用、区别以及各自的优缺点。 1. FutureTask&#xff1a;基础异步任务的引路者…

AR特效自研AI算法技术解决方案

在当今这个高速发展的数字化时代&#xff0c;增强现实&#xff08;AR&#xff09;技术已经成为企业创新和市场竞争的重要手段。美摄科技凭借对AI技术的深厚积累&#xff0c;为企业提供了一套创新的AR特效自研AI算法技术解决方案&#xff0c;旨在满足企业在AR领域的多元化需求。…

选择大语言模型:2024 年开源 LLM 入门指南

作者&#xff1a;来自 Elastic Aditya Tripathi 如果说人工智能在 2023 年起飞&#xff0c;这绝对是轻描淡写的说法。数千种新的人工智能工具被推出&#xff0c;人工智能功能被添加到现有的应用程序中&#xff0c;好莱坞因对这项技术的担忧而戛然而止。 甚至还有一个人工智能工…

【Kotlin】自定义Json反序列化

最近在项目中发现之前同事在使用Redis存储对象的时候&#xff0c;给日期字段存了两种不同的日期格式&#xff0c;进而导致查询时反序列化报错&#xff0c;因此写了一个注解配置类来自定义反序列化的方式。 /*** LocalDateTime反序列化&#xff0c;下方的LocalDate同理&#xff…

C++强制类型转换之static_cast

例1&#xff0c;将 double 类型转换为 int 类型 double d 5.5; int i static_cast<int>(d); printf("i %d\n", i);运行结果如下&#xff1a; i 5例2&#xff0c;将 int 类型转换为 double 类型 int a 10; int b 3; double c a / b; double d static…

代码随想录 Leetcode46. 全排列

题目&#xff1a; 代码&#xff08;首刷自解 2024年2月6日&#xff09;&#xff1a; class Solution { private:vector<vector<int>> res;vector<int> path; public:void backtracking(vector<int>& nums, int depth, vector<bool>& us…

golang+selenium自动化+chrome浏览器操作

1,selenium 是自动化测试以及自动化爬取的框架,常用于python开发,今天这里使用golang selenium进行自动化开发,相比python,主要是社区广泛,golang同样也是跟python功能一样,同时go可以支持大并发携程 自动化爬取节省资源,下面我们就直接上代码案例操作 1,首先需要下载谷歌驱动,…

EmoLLM-心理健康大模型

宣传一下自己最近参与的开源 https://github.com/aJupyter/EmoLLM EmoLLM-心理健康大模型 EmoLLM 探索本项目的文档 查看Demo 报告Bug 提出新特性 EmoLLM 是一个能够支持 理解用户-支持用户-帮助用户 心理健康辅导链路的心理健康大模型&#xff0c;由 InternLM2 指令微…

数据结构第十天(排序算法总结)

目录 前言 常数时间复杂度&#xff1a;O(1) 线性时间复杂度&#xff1a;O(n) 线性对数时间复杂度&#xff1a;O(n log n) 平方时间复杂度&#xff1a;O(n^2) 对数时间复杂度&#xff1a;O(log n) 前言 排序算法的学习可以告一段落了。但算法的学习永不停止。 今天&…

redis:七、集群方案(主从复制、哨兵模式、分片集群)和面试模板

redis集群方案 在Redis中提供的集群方案总共有三种&#xff08;一般一个redis节点不超过10G内存&#xff09; 主从复制哨兵模式分片集群 主从复制&#xff08;主从数据同步&#xff09; replid和offset Replication Id&#xff1a;简称replid&#xff0c;是数据集的标记&a…

C++集群聊天服务器 数据模块+业务模块+CMake构建项目 笔记 (上)

跟着施磊老师做C项目&#xff0c;施磊老师_腾讯课堂 (qq.com) 本文在此篇博客的基础上继续实现数据模块和业务模块代码&#xff1a; C集群聊天服务器 网络模块业务模块CMake构建项目 笔记 &#xff08;上&#xff09;-CSDN博客https://blog.csdn.net/weixin_41987016/article…

显示器校准软件:BetterDisplay Pro for Mac v2.0.11激活版下载

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件&#xff0c;可以帮助用户调整显示器的颜色和亮度&#xff0c;以获得更加真实、清晰和舒适的视觉体验。 软件下载&#xff1a; BetterDisplay Pro for Mac v2.0.11激活版下载 以下是BetterDisplay Pro的主要…