C++ ---- 日期类实现+阅读文档(文档可直接下载)

news2024/11/27 10:42:15

日期类文档下载(日期类详细介绍)

word文档

MyDate/MyDate/日期类阅读文档.docx · 张喜阳/进阶代码仓库 - Gitee.comhttps://gitee.com/niuniuzxy/advanced-code-warehouse/blob/a25baeee2bd0f0c64f96315bb0d0023308329d92/MyDate/MyDate/%E6%97%A5%E6%9C%9F%E7%B1%BB%E9%98%85%E8%AF%BB%E6%96%87%E6%A1%A3.docxPDFMyDate/MyDate/日期类阅读文档.pdf · 张喜阳/进阶代码仓库 - Gitee.comhttps://gitee.com/niuniuzxy/advanced-code-warehouse/blob/a25baeee2bd0f0c64f96315bb0d0023308329d92/MyDate/MyDate/%E6%97%A5%E6%9C%9F%E7%B1%BB%E9%98%85%E8%AF%BB%E6%96%87%E6%A1%A3.pdf

日期类介绍

 

通过日期类的实现,对类和对象的语法进行熟悉,以练带学。对于运算符重载等知识进行巩固,对于流插入和流提取、前置++和后置++等运算符重载深入理解,让日期类能向内置类型一样进行加减,输入输出等操作。

要点分析(更多内容在文档中有介绍)

前置++和后置++对比

对于内置类型而言,后置++/--比前置++/--多了一次拷贝,在实现上后置的++/--的参数列表要显示的写int,这是和编译器的暗号,用来区分是前置++/--还是后置++/--。

流插入和流提取的重载

流插入和流提取在基础篇介绍过,它们分别是istream和ostream的对象,对于自定义类型而言,流插入和流提取是无法识别的,因为库中只实现了内置类型的<<和>>重载。当我们想要自定义类型的对象像内置类型一样输出和输出时,需要重载<<和>>。

日期加天数分析

 更详细的处理在文档中有介绍,还包括日期类对象-天数等逻辑分析。

整体代码 

Date.h

#pragma once
#include <iostream>
using namespace std;
class Date
{
	friend  ostream& operator<<(ostream& out, const Date& d1);
	friend  istream& operator>>(istream& in,Date& d1);

public:
	//频繁调用,放在类中,默认内联属性
	int GetMonthDay(int year, int month)
	{
		int monthDay[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
		//如果是闰年,2月有29天
		if (month == 2 && ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
		{
			return 29;
		}
		else
		{
			return monthDay[month];
		}
	}
	Date() {}
	Date(int year, int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
		if (month > 12 || day > GetMonthDay(year, month))
		{
			cout << "错误的日期" << endl;
			Show();
		}
	}
	//按一定格式打印日期
	void Show() const;
	//判断两个日期是否相等
	bool operator==(const Date& d1) const;
	//判断两个日期是否不相等
	bool operator!=(const Date& d1) const;
	//*this是否大于d1
	bool operator>(const Date& d1) const;
	//*this是否>=d1
	bool operator>=(const Date& d1) const;
	//*this是否小于d1
	bool operator<(const Date& d1) const;
	//*this是否小于等于d1
	bool operator<=(const Date& d1) const;
	//前置++
	Date& operator++()
	{
		*this += 1;
		return *this;
	}
	//后置++
	Date operator++(int)
	{
		Date temp(*this);
		*this += 1;
		return temp;
	}
	//前置--
	Date& operator--()
	{
		*this -= 1;
		return *this;
	}
	//后置--
	Date operator--(int)
	{
		Date dd(*this);
		*this -= 1;
		return dd;
	}
	
	//日期+=天数
	Date& operator+=(const size_t day);
	//日期+天数
	Date operator+(const size_t day)const;
	//日期-=天数
	Date& operator-=(const size_t day);
	//日期-天数
	Date operator-(const size_t day)const;
	//日期-日期
	int operator-(const Date& d1);

	//赋值重载,默认生成的就可以
	//拷贝构造,内置类型逐字节拷贝,默认的就行
	//析构,不申请资源,不写了
private:
	int _year=1;
	int _month=1;
	int _day=1;
};

//流插入重载
inline ostream& operator<<(ostream& out,const Date& d1)
{
	out << d1._year << "/" << d1._month << "/" << d1._day << endl;
	return out;
}
//流提取重载
inline istream& operator>>(istream& in,Date& d1)
{
	in >> d1._year >> d1._month >> d1._day;
	return in;
}

Date.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include "Date.h"

void Date::Show()const
{
	cout << _year << "年" << _month << "月" << _day << endl;
}

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

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

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

	return false;
}

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

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

Date& Date::operator+=(const size_t day)
{
	//if (day < 0)
	//{
	//	//加负天等于减去整天
	//	return *this -=  (-day);
	//}
	_day += day;

	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		_month++;

		if (_month > 12)
		{
			_year++;
			_month = 1;
		}
	}
	return *this;
}
Date Date::operator+(const size_t day)const
{
	Date dd(*this);
	dd += day;
	return dd;
}
Date& Date::operator-=(const size_t 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-(const size_t day)const
{
	Date dd(*this);
	dd -= day;
	return dd;
}
int Date::operator-(const Date& d1)
{
	Date tmp(d1);
	int flag = 1;
	Date Max = *this;
	Date Min = tmp;

	if (*this < tmp)
	{
		flag = -1;
		Max = tmp;
		Min = *this;
	}

	int daySum = 0;
	while (Max != Min)
	{
		++Min;
		daySum++;
	}
	return daySum * flag;
}

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

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

相关文章

十六、Config分布式配置中心

目录 分布式配置中心概述 1、为什么需要分布式配置中心&#xff1f; 2、配置中心的作用&#xff1a; Spring Cloud Config简介 新建项目springcloud-config-server 1、引入配置中心config-server的依赖 2、在github/gitee上新建一个远程仓库作为config的远程配置中心 3、…

3年测试技术面一题都看不懂,字节面试真的变态.....

最近我的一个读者朋友去了字节面试&#xff0c;来给我发信息吐槽&#xff0c;说字节的面试太困难了&#xff0c;像他这种三年经验的测试员&#xff0c;在技术面&#xff0c;居然一题都答不上来&#xff0c;这要多高的水平才能有资格去面试字节的测试岗位。 确实&#xff0c;字…

Vue2+CSS实现一个瀑布流布局案例

在练习代码的时候&#xff0c;看到了携程的首页下方的布局还挺好看 就是一个瀑布流的布局效果&#xff0c;在携程上是一共两列布局&#xff0c;然后每个格子的高度都会根据图片的高度做排布 一开始是想使用flex进行布局&#xff0c;先让每个格子各占百分之49&#xff0c;然后贴…

微信小程序实现电子书搜索与下载

1、背景 自己已经做了一版电子书下载网站&#xff08;走蛟电子书&#xff09;&#xff0c;但用户使用手机更方便些&#xff0c;为改善用户体验&#xff0c;准备做一款微信小程序实现电子书搜索与下载的功能。 2、技术栈 由于功能较为单一&#xff0c;因此前端使用原生的微信…

CSS基础语法

CSS基础语法知识 文章目录 CSS基础语法1. CSS的引入方式1.1 内部样式1.2 外部样式1.3 内联样式 2. CSS标签选择器2.1 标签选择器2.2 类选择器2.3 id选择器2.4 复合选择器 3. CSS常见属性3.1 字体相关3.2 文本相关3.3 颜色的写法3.4 背景相关3.5 边框相关3.6 元素的显示模式3.7 …

【链表应用】| 一元多项式的操作

目录 一. &#x1f981; 要求:二. 代码实现&#xff08;Java & c&#xff09;1. Java实现2.C语言实现 三. &#x1f981; 总结 一. &#x1f981; 要求: 设有两个一元多项式: p(x)p0p1xp2x2pnxn q(x)q0q1xq2x2qmxm 多项式项的系数为实数&#xff0c;指数为整数&#xff0c…

11个免费的数据可视化工具推荐

数据可视化之所以流行&#xff0c;不仅是因为它简化了我们查看复杂数据的方式&#xff0c;更是因为数据可视化可以加快我们获取数据信息的速度。 本文专门为您列出了11个免费的数据可视化工具&#xff0c;帮助您快速掌握数据可视化技能。 1.即时设计 即时设计是可云端编辑的…

物通博联工业物联网解决方案,助力工厂实现设备远程运维

各类设备制造工厂随着经营规模与业务的扩张&#xff0c;设备可以销往全国各地甚至是全球&#xff0c;是工厂实力的体现。当设备越来越多、分布越来越广&#xff0c;设备管理的工作量和成本直线上升&#xff0c;可能面对维护不及时的情况&#xff0c;影响到客户经济效益和对工厂…

spark源码 spark on yarn环境的创建

1.入口类 sparkSubmit 的main方法 提交application submitnew SparkSubmit submit.doSubmit(args) -> super.doSubmit(args): parseArguments(args) &#xff1a;参数解析 方法 中 new sparkSubmitArguments(args) 点进去该类(主要解析参数)&#xff0c;然后找到parse&am…

C/C++ 内存管理 new delete operator new与operator delete函数 内存泄漏

C/C 内存分布 在C/C 当中有 &#xff1a; 局部数据静态数据和全局数据常量数据动态申请数据 上述不同的数据存储的位置也不同&#xff0c;&#xff1a; 1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。2. 内存映射段是高效的I/O映射方式&…

Java运算符详解

目录 &#x1f511;前言 &#x1f3bd;算式运算符 ⚙赋值运算符 &#x1f34a;关系运算符 &#x1f37a;逻辑运算符 &#x1f352;位运算符 &#x1f339;移位运算符 &#x1f343;条件运算符 &#x1f349;运算符优先级 &#x1f511;前言 任何一个程序都离不开计算问题&…

IOC/DI配置管理第三方bean(Druid/C3P0)

文章目录 1 案例:数据源对象管理1.1 环境准备1.2 思路分析1.3 实现Druid管理步骤1:导入druid的依赖步骤2:配置第三方bean步骤3:从IOC容器中获取对应的bean对象步骤4:运行程序 1.4 实现C3P0管理步骤1:导入C3P0的依赖步骤2:配置第三方bean步骤3:运行程序 2 加载properties文件2.1…

详解MySQL的并发控制

目录 1.概述 2.事务 2.1.什么是事务 2.2.事务的隔离级别 2.2.1.三种数据一致性问题 2.2.2.四种隔离级别 2.3.如何设置隔离级别 3.锁 3.1.锁与事务的关系 3.2.分类 3.3.表锁 3.3.1.概述 3.3.2.读锁 3.3.3.写锁 3.3.4.保护机制 3.4.行锁 3.4.1.概述 3.4.2.什么…

Redis Java API操作

1、普通maven工程方式 Redis不仅可以通过命令行进行操作&#xff0c;也可以通过JavaAPI操作&#xff0c;通过使用Java API来对Redis数据库中的各种数据类型操作 导入POM依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http…

【Linux Network】传输层协议——UDP

目录 传输层 端口号 端口号范围划分 认识知名端口号(Well-Know Port Number) netstat pidof UDP协议 UDP协议端格式 UDP的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 UDP详解&#x1f337; 传输层 在TCP/IP协议中可以把网络简单的划分为四个部分&#…

大数据如何助力营销(3)产品定位

在市场竞争日益激烈的环境下&#xff0c;产品定位是企业成功的关键因素之一。产品定位是指根据目标市场和目标消费者的需求、偏好和期望&#xff0c;确定产品的特性、功能、形象和价值&#xff0c;并与竞争对手的产品进行差异化的过程。产品定位不仅影响产品的设计、开发、生产…

全面讲解涂鸦PaaS2.0开发平台!物联网干货预警

之前我们有介绍过涂鸦 IoT PaaS&#xff08;点击查看往期介绍&#xff09;&#xff0c;面向开发生态&#xff0c;它集成了云开发、App 开发、硬件开发三大核心支撑能力&#xff0c;能够全方位助力开发者打造极具竞争力的个性化 IoT 解决方案&#xff0c;极大地降低 IoT 开发门槛…

Appium APP自动化环境搭建

1.下载安装 F:\android-sdk-windows F:\Appium-windows-1.21.0 F:\nodejs 2.创建一个bat文件&#xff0c;命名为appium.bat&#xff0c;并在其中写入如下内容&#xff1a; node Appium安装目录\resources\app\node_modules\appium\build\lib\main.js %* 注意&#xff1a;请…

从0到1开始,一步步搭建Web自动化测试框架

测试框架的设计有两种思路&#xff0c;一种是自底向上&#xff0c;从脚本逐步演变完善成框架&#xff0c;这种适合新手了解框架的演变过程。另一种则是自顶向下&#xff0c;直接设计框架结构和选取各种问题的解决方案&#xff0c;这种适合有较多框架事件经验的人。本章和下一张…

【zabbix】批量监控端口,自动发现规则

快速搞定端口批量监控 一、脚本及配置 1、&#xff08;文件名&#xff1a;check_port.py&#xff09;&#xff08;python2.7版本&#xff09; 存在路径&#xff1a;/etc/zabbix/zabbix_agentd.d/check_port.py 这个脚本有一部分内容是我从百度上找的&#xff0c;有一部分自己…