日期类的实现

目录

Date.h

Test.cpp

测试代码Test.cpp


日期类的实现

代码分享

Date.h

#pragma once
#include<iostream>
using namespace std;
#include<assert.h>class Date
{//友元函数声明friend ostream& operator<<(ostream& out, Date& d);friend istream& operator>>(istream& in, Date& d);public:// 全缺省的构造函数Date(int year = 1, int month = 1, int day = 1);// 拷贝构造函数Date (const Date& d);// 赋值运算符重载// d2 = d3; -> d2.operator=(&d2, d3);Date& operator=(const Date& d);// 析构函数~Date();// 直接定义类里面,他默认是inline// 频繁调用//得到月的天数int GetMonthDay(int year, int month){assert(month>0&& month<13);static int MonthDay[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 MonthDay[month];}bool CheckDate();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 += (int day);Date operator + (int day)const;Date& operator ++ ();// 为了区分,构成重载,给后置++,强行增加了一个int形参// 这里不需要写形参名,因为接收值是多少不重要,也不需要用// 这个参数仅仅是为了跟前置++构成重载区分Date operator ++ (int);Date& operator -= (int day);Date operator - (int day)const;//日期减日期int operator -(const Date& d)const;Date& operator -- ();Date operator -- (int);// 流插入// 不建议,因为Date* this占据了一个参数位置,使用d<<cout不符合习惯//void operator<<(ostream& out);void Printf()const{cout << _year << "年" << _month << "月" << _day << "日" << endl;}private:int _year = 1;int _month = 1;int _day = 1;
};

Test.cpp

#include"Date.h"bool Date::CheckDate()
{if (_month < 1 || _month>12|| _day<1 || _day>GetMonthDay(_year, _month)){return false;}else{return true;}
}// 全缺省的构造函数
Date::Date(int year , int month , int day )
{_year = year;_month = month;_day = day;if (!CheckDate()){cout << "日期非法" << endl;}
}
//Date d2(d1);
//Date d2 = d1;
// 拷贝构造函数
Date::Date(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;}// 赋值运算符重载
// d2 = d3; -> d2.operator=(&d2, d3);
Date& Date::operator=(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;return *this;
}// 析构函数
Date::~Date()
{_year = 1;_month = 1;_day = 1;
}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);
}bool Date::operator <(const Date& d)const
{if(this->_year<d._year){return true;}else{if (this->_year == d._year && this->_month < d._month){return true;}if (this->_year == d._year && this->_month == d._month && this->_day < d._day){return true;}}return false;
}
bool Date::operator > (const Date& d)const
{return (!(*this < d)) && *this != d;//易错,或者!(*this<=d),但是要在<=函数后面
}bool Date::operator <=(const Date& d)const
{return *this < d || *this == d;
}
bool Date::operator >= (const Date& d)const
{return *this > d || *this == d;
}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 ++ ()
{*this += 1;return *this;}
Date Date::operator ++ (int)
{Date tmp = *this;*this += 1;return tmp;
}Date& Date::operator -= (int day)
{if(day<0){return *this += -day;}_day -= day;while (_day < 1){--_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;
}//日期减日期
int Date::operator -(const Date& d)const
{int flag = 1;int count = 0;//假设this大,d小Date max = (*this);Date min = d;if (max < min){max = d;min = (*this);flag = -1;}while (max>min){++min;//一般用前置++count;}return count * flag;
}Date& Date::operator -- ()
{*this -= 1;return *this;
}
Date Date::operator -- (int)
{Date tmp = *this;*this -= 1;return tmp;
}ostream& operator<<(ostream& out,Date& d)
{out << d._year << "年" <<d._month << "月" << d._day << "日" << endl;return out;
}istream& operator>>(istream& in, Date& d)
{cout << "请输入年,月,日" << endl;in >> d._year >> d._month >> d._day;if (!d.CheckDate()){cout << "日期非法" << endl;}return in;
}

测试代码Test.cpp

#include"Date.h"
using namespace std;void Test1()
{Date d1(2022,6,21);Date d2 = d1;Date d3(2022,6,1);if (d3 < d1){cout << "d3<d1" << endl;}
}void Test2()
{Date d1(2024, 4, 21);Date d2 = d1;d2 += 3000;d2.Printf();Date d3 = d1 + 300;d3.Printf();Date d4= d3++;d4.Printf();++d3;d3.Printf();}void Test3()
{Date d1(2024,4,21);Date d2 = d1 - 5000;d1 -= 20;d1.Printf();d2.Printf();
}void Test4()
{Date d1(2024,4,21);Date d2(2002,2,14);int day = d2 - d1;cout << day << "Ìì" << endl;
}void Test5()
{Date d1(2024,4,21);Date d2=d1--;d2.Printf();d1.Printf();--d1;d1.Printf();
}void Test6()
{Date d1(2024, 4, 14);Date d2 = d1 + 30000;// operator<<(cout, d1)cout << d1;cout << d2;cin >> d1 ;d2 = d1 + 30000;cout << d1 << d2;
}
int main()
{/*Test6();*/Date d1(2024, 4, 21);Date d2(2024, 4, 21);if (d1 == d2){cout << "d1 == d2" << endl;}return 0;
}

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助

欢迎各位点赞,收藏和关注哦

如果有疑问或有不同见解,欢迎在评论区留言哦

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

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

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

相关文章

[渗透测试学习] Headless-HackTheBox

Headless-HackTheBox 信息搜集 使用nmap扫描一下 nmap -sV -sC -v --min-rate 1000 10.10.11.8可以发现5000端口是开放的,继续扫一下目录 访问/dashboard发现只有admin才可以,我们注意到cookie值为JWT加密,拿到揭秘网站验证下猜想 cookie为user用户,那么我们要想访问必须…

[阅读笔记29][AgentStudio]A Toolkit for Building General Virtual Agents

这篇论文是24年3月提交的&#xff0c;提出了一个用于agent开发的全流程工具包。 作者提到目前agent开发主要有两个阻碍&#xff0c;一个是缺乏软件基础&#xff0c;另一个是缺乏在真实世界场景中进行评估。针对这两个阻碍&#xff0c;作者涉及了一个开发工具包&#xff0c;包括…

[已解决]react打包部署

react打包部署 问题 npm install 命令无反应 思路 换成 yarn install 安装完hadoop的环境后&#xff0c;使用node的yarn会报错&#xff1a; 我们在cmd使用where yarn&#xff0c;如下&#xff1a; 看你想保留哪一个&#xff0c;我平时node用的多&#xff0c;就把hadoop的y…

项目小游戏-贪吃蛇

目录 1.游戏开始 - GameStart 1.1cmd命令窗口 调节窗口命令 ​编辑更改窗口命名 ​编辑 1.2 Win32 API win32 API 的介绍: ​编辑 获取控制台坐标COORD 获取控制台句柄: 获取缓冲台光标信息: 获取虚拟键位: 本地初始化 setlocale(); 游戏开始的具体实现&#xff1a…

使用AOP切面做防止用户重复提交功能

在我们的项目中&#xff0c;需要考虑到有时候因为网络原因或者其他原因用户对同一个接口进行同一批数据的重复性操作&#xff0c;如果不做这样的处理很可能会在数据库中添加多条同样的数据。 我们可以通过使用aop来解决这样的问题&#xff0c;接下来看看具体怎么做吧~ 自定义…

网络原理-UDP和TCP

在传输层中有两个非常重要的协议&#xff0c;UDP和TCP&#xff0c;现在就来研究一下这两个协议。 UDP 报文格式 我们观察可以发现&#xff0c;里面UDP报文长度为2个字节&#xff0c;那么是多少呢&#xff1f;我们需要快速反应如下固定字节数据类型的取值范围&#xff1a; 字…

Jenkins服务器IP更换,Jenkins URL地址更换

服务器的网络地址发生变动&#xff0c;修改jenkins服务器IP地址后&#xff0c;jenkins网页能够打开&#xff0c;但是job中的配置钩子没有自动改变&#xff0c;如图所示&#xff1a; 经过查询资料了解&#xff0c;需要修改jenkins本地化配置地址才可以显示正确&#xff1a; 1、…

初识ansible变量及实例配置

目录 1、为什么要使用变量 2、变量分类 3、 变量详解 3.1 vars,vars_files , group_vars 3.1 .1 vars 剧本中定义变量 3.1.2 vars_file 将变量存放到一个文件中&#xff0c;并在剧本中引用 3.1.3 group_vars 创建一个变量文件给某个组使用 实例1-根据不同的主机…

Java关键字和API

1 this和super关键字 1.this和super的意义 this&#xff1a;当前对象 在构造器和非静态代码块中&#xff0c;表示正在new的对象 在实例方法中&#xff0c;表示调用当前方法的对象 super&#xff1a;引用父类声明的成员 无论是this和super都是和对象有关的。 2.this和sup…

通过实例学C#之序列化与反序列化XmlSerializer类

简介 可以将类序列化成xml文件&#xff0c;或者将xml文件反序列化成类对象&#xff0c;一般用于保存或加载项目参数。 构造函数 XmlSerializer() 不使用函数创建一个xmlSerializer对象。 XmlSerializer(Type type) 使用type对象创建一个xmlSerializer对象&#xff0c;注意&…

【001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂】

001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂 文章目录 001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂创作背景通信模型ISO/OSI七层模型 和 TCP/IP四层模型网络通信数据包格式&#xff08;Ethernet II&…

20240421阿夏的CSDN创作纪念日(3周年)

缘 提示&#xff1a;可以和大家分享最初成为创作者的初心 3年前我写下第一篇CSDN&#xff0c;开启了Python研究之旅win10系统64位&#xff08; 惠普&#xff09;台式电脑自动开机、关机图文详细解&#xff08;一&#xff09;_惠普主板设置自动开机-CSDN博客文章浏览阅读4.2k次…

深入OceanBase内部机制:资源隔离实现的方式总结

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 1. 为何HTAP需要资源隔离2. OceanBase的资源隔离机制概述租户间资源隔离租户内资源隔离物理资源隔离大查询请求的隔离优先级…

4月21敲一篇猜数字游戏,封装函数,void,无限循环,快去体验体验

今天敲一篇猜数字游戏 目录 今天敲一篇猜数字游戏 1.打开先学goto语句&#xff1a; 2.开干&#xff1a; 首次我们学习随机数&#xff1a; 讲解一下&#xff1a; 改用srand; 加入时间变量&#xff1a; 获取时间&#xff1a;哈​编辑 3.我本来想已近够完美了&#xff0…

Flink学习(七)-单词统计

前言 Flink是流批一体的框架。因此既可以处理以流的方式处理&#xff0c;也可以按批次处理。 一、代码基础格式 //1st 设置执行环境 xxxEnvironment env xxxEnvironment.getEnvironment;//2nd 设置流 DataSource xxxDSenv.xxxx();//3rd 设置转换 Xxx transformation xxxDS.…

Spring Boot中接收各种各样的参数

一、接收json参数&#xff0c;封装为Map 1.1、核心代码 /*** 接收json参数&#xff0c;封装为Map* param servletRequest* return* throws Exception*/ PostMapping("/getParam") public R getParam(HttpServletRequest servletRequest) throws Exception {Map<…

Bootstrap 5 保姆级教程(十二):弹出框 消息弹窗

一、弹出框 1.1 创建弹出框 通过向元素添加 data-bs-toggle"popover" 来来创建弹出框。 title 属性的内容为弹出框的标题&#xff0c;data-bs-content 属性显示了弹出框的文本内容&#xff1a; 注意: 弹出框要写在 JavaScript 的初始化代码里。 以下实例可以在文…

投入产出表的分析要点有哪些

投入产出分析是利用投入产出表、投入产出系数和投入产出模型&#xff0c;对国民经济各部门之间的技术经济联系和影响进行分析的一种经济数据分析方法。 一、什么是投入产出表 我国的投入产出表是描述国民经济中各种产品的来源与使用去向的棋盘式平衡表 , 是产品部门 产品部门…

【已解决】电脑设置notepad++默认打开txt

1、以管理员的方式打开notepad 步骤&#xff1a;打开设置 -> 首选项 -> 文件关联 2、 设置Notepad默认打开 按照以下步骤将Notepad设置为默认打开.txt文件&#xff1a; 右键单击任何一个.txt文件。选择“属性”。在“常规”选项卡中&#xff0c;找到“打开方式”&#…

【Interconnection Networks 互连网络】Dragonfly Topology 蜻蜓网络拓扑

蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数2. Topology Description 拓扑描述3. Topology Variations 拓扑变体 蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数 Dragonfly拓扑参数&#xff1a; N N N: 网络中终端(terminal)的总数量 p p p: 连接到每个路由器的终端数量 a a a: 每…