日期类的实现

目录

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.hqwc.cn/news/637241.html

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

相关文章

书生·浦语大模型全链路开源体系-第5课

书生浦语大模型全链路开源体系-第5课 书生浦语大模型全链路开源体系-第5课相关资源LMDeploy基础配置LMDeploy运行环境下载internlm2-chat-1_8b模型使用Transformer来直接运行InternLM2-Chat-1.8B模型使用LMDeploy以命令行方式与InternLM2-Chat-1.8B模型对话设置KV Cache最大占用…

2024 Guitar Pro如何加音乐符号及功能介绍

一、新版本特性概览 Guitar Pro v8.1.1 Build 17在保留了前版本强大功能的基础上&#xff0c;进一步优化了用户体验和功能性能。新版本主要更新包括以下几个方面&#xff1a; 界面优化&#xff1a;新版界面更加简洁美观&#xff0c;操作更加便捷&#xff0c;即使是初学者也能快…

mapreduce中的ReduceTask工作机制(Hadoop)

ReduceTask 是 Hadoop 中的一个重要组件&#xff0c;负责对 MapTask 的输出进行合并、排序和归并&#xff0c;最终生成最终的输出结果。 ReduceTask 的工作机制 1. 分组&#xff08;Shuffle&#xff09;阶段&#xff1a; 在分组阶段&#xff0c;ReduceTask 会从多个 Mapper …

【搞钱必看】计算机视觉入门,普通人也能学会的高科技!

目录 1. 计算机视觉&#xff0c;未来科技的金矿 2. 计算机视觉入门&#xff0c;真的那么难吗&#xff1f; 3. 入门步骤&#xff0c;轻松上手 4. 学习资源&#xff0c;助力你的成长 5. 实践是关键&#xff0c;动手操作吧&#xff01; 6. 挑战与机遇并存 啊啊啊啊啊啊啊…

前端开发攻略---Vue项目(Vue2和Vue3)引入高德地图,超详细,超简单,保姆级教程。

1、图片演示 2、引入前的准备 1、前往 高德开放平台 进行账号注册。如果手机上有高德地图App并且已经登录过&#xff0c;则可以直接选择登录 2、注册/登录完成后来到应用管理-->我的应用 3、点击创建新应用 4、填写好应用名称和选择应用类型 5、填写好后点击添加Key 6、填写…

算法新手(一)——位运算、算法是什么、介绍位运算和简单排序

一、二进制、位运算 java中int最大值&#xff0c;2的31次方-1&#xff0c;为什么不是2的32次方-1&#xff1f; ——因为第一位是符号位&#xff0c;0表示正数&#xff0c;1表示复数&#xff1b; 1.1 Integer二进制 -1的二进制&#xff1a; 11111111111111111111111111111111…

2024团体程序设计天梯赛L1-101 别再来这么多猫娘了!

题目链接L1-101 别再来这么多猫娘了&#xff01; #include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<algorithm> using namespace std; string s[105], text; int n, k, ans, a[5005];int main() { // ios::s…

【xhs爬虫软件】把小红书评论comment接口封装成GUI采集工具!

用Python开发爬虫采集软件&#xff0c;可自动抓取小红书评论数据&#xff0c;并且含二级评论。 小红书的评论接口URL是&#xff1a; https://edith.xiaohongshu.com/api/sns/web/v2/comment/page 开发者模式分析过程&#xff1a; 进而封装成GUI界面软件&#xff0c;如下&…

基于SpringBoot+Vue七匹狼商城系统的设计与实现

系统介绍 近年来随着社会科技的不断发展&#xff0c;人们的生活方方面面进入了信息化时代。计算机的普及&#xff0c;使得我们的生活更加丰富多彩&#xff0c;越来越多的人使用通过网络来购买各类的商品。早期商品的销售和购买都是通过实体店&#xff0c;这种购买方式需要耗费…

齐超:思颜肌密从单科特长生向全科学霸进化

“从单科特长生向全科学霸进化”。 中国化妆品行业发展至今&#xff0c;走过了线下渠道蓬勃发展的时代&#xff0c;也经历了电商渠道的黄金时代&#xff0c;继而迈入当下的直播时代。而在每一个时代的转折点上&#xff0c;思颜肌密始终在行业前列&#xff0c;跨越一个个生命周…

网络 (TCP/IP 四层协议中常见网络协议)

应用层 DNS (Domain Name System) 域名系统. DNS 是一整套从域名映射到 IP的系统 NAT 技术 解决 IP 地址不够用的问题. 可以实现私有 IP 和全局 IP 的相互转换 NAPT 技术 使用 IP Port 唯一确定局域网中的主机 传输层 TCP 协议 (Transmission Control Protocol 传输控制协议…

linux定时备份数据库sql文件(表格、视图、存储过程,已保存的查询语句不会被备份)

创建一个脚本文件xxx.sh 为其设置全部权限chmod 777 xxx.sh #!/bin/bash # 设置备份目录和文件名 current_time$(date "%Y%m%d_%H%M%S") backup_dir"/root/db_back/db" backup_file"$backup_dir/db_ship_backup_$current_time.sql" log_file&…