日期类的实现

目录

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)的学习干货以及重要代码的分享

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LWIP开发之静态IP为什么接收和发送不了数据

使用的硬件开发板是探索者F4 V3版本 这里用的LWIP的lwIP例程7 lwIP_NETCONN_UDP实验 问了开发板的官方和其他人都说不清楚&#xff1b;搞了两天&#xff0c;浪费了两天时间&#xff1b; 最奇葩的问题还在于只能单片机发送&#xff0c;上位机能接收。而上位机发送单片机不能接…

国产信创办公软件(流版式软件)厂家汇总以及国产信创外设汇总

国产信创办公软件&#xff08;流版式软件&#xff09;厂家汇总以及国产信创外设汇总。 国产信创办公软件&#xff08;流版式软件&#xff09;厂家汇总 在信创背景下&#xff0c;国内流版式软件的发展呈现出蓬勃的态势。信创&#xff0c;即信息技术应用创新产业&#xff0c;旨在…

通过WSL在阿里云上部署Django项目MySQL

前端用Vue&#xff0c;后端用Django&#xff0c; nginx&#xff0c;Mysql 参照&#xff1a; 通过WSL在阿里云上部署Vue项目_阿里云 wsl-CSDN博客 阿里云重登录 采用Ubuntu系统&#xff0c; apt update #检查是否已经安装 mysql --version #检查是否已经安装mysql systemct…

List的介绍

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

MySQL慢查询怎么办?需要关注Explain的哪些关键字?

目录 1-引言&#xff1a;什么是慢查询1-1 慢查询定义1-2 为什么排查慢查询 2-核心&#xff1a;慢查询排查2-1 慢查询定位2-2 慢查询解决2-2-1 Explain 排查慢查询2-2-2 Explain 重点关键字 3-总结&#xff1a;慢查询知识点小结 1-引言&#xff1a;什么是慢查询 1-1 慢查询定义…

配置静态路由实现全网互通

1、实验环境 如图下所示&#xff0c;三台路由器R1&#xff0e;R2&#xff0c;R3两两互连&#xff0c;每台路由器上都配置了Loopback地址模拟网络环境。 2、需求描述 需要在三台路由器上配置静态路由&#xff0c;以实现各网段之间的互通。 若要实现全网互通,必须明确如下两个问…

kaggle 泰坦尼克使用xgboost 得分0.73684

流程 导入所要使用的包引入kaggle的数据集csv文件查看数据集有无空值填充这些空值提取特征分离训练集和测试集调用模型 导入需要的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarni…

Hive基础5

一、窗口函数 聚合&#xff0c;取值函数 排序函数 over(partition by 分组字段 order by 字段 row between 起始行 and 结束行) /*创建部门表*/ CREATE TABLE dept (deptno INT PRIMARY KEY,dname VARCHAR(50) comment 部门名称,loc VARCHAR(50) comment 工作地点 ); ​ /*…

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…

【项目】基于JDBC+MySQL的Java教务管理系统(附源码+论文说明)

摘要 随着信息技术的不断发展&#xff0c;教育管理也在向数字化、智能化方向迈进。Java作为一种广泛应用于企业级应用开发的编程语言&#xff0c;与数据库技术的结合更是为教务管理系统的开发提供了强大的支持。 本文将介绍基于JDBC&#xff08;Java Database Connectivity&a…

短视频不够500有效粉丝怎么涨?如何涨有效粉丝?巨量千川投流怎么涨粉的?

近期&#xff0c;一些使用抖音橱窗功能的用户遇到了一个问题&#xff0c;他们在挂橱窗时会出现“有效粉丝不足500”无法正常挂橱窗的提示。这个问题是由于抖音平台改变了规则所致。现在&#xff0c;只有通过观看视频而非刷关注的粉丝才被算作有效粉丝&#xff0c;其他的粉丝都将…

39. UE5 RPG角色释放技能时转向目标方向

在上一篇&#xff0c;我们实现了火球术可以向目标方向发射&#xff0c;并且还可以按住Shift选择方向进行攻击。技能的问题解决&#xff0c;现在人物释放技能时&#xff0c;无法朝向目标方向&#xff0c;接下来我们解决人物的问题。 实现思路&#xff1a; 我们将使用一个官方的…

(CVPR,2023)SAN:用于开放词汇语义分割的边缘适配网络

文章目录 相关论文相关资料摘要引言方法对视觉 token 的特征融合使用注意力偏差进行掩码识别分割图像生成 实验 相关论文 &#xff08;CVPR&#xff0c;2024&#xff09;SED&#xff1a;一个用于开放词汇语义分割的简单编解码器 &#xff08;CVPR&#xff0c;2024&#xff09;…

python int占几个字节

《深入理解计算机系统》这本书上面提到了在32位机器和64机器中int类型都占用4个字节。《The C Programming language》这本书&#xff0c;里面有一句话是这样的&#xff1a;Each compiler is free to choose appropriate sizes for its own hardware, subject only to the rest…

https协议的加密方式详解

各位大佬能多多点赞关注评论收藏&#xff0c;球球各位大佬们了&#xff01;&#xff01; &#xff01; 目录 1.为什么要加密&#xff1f; 2.如何加密 1.密钥&#xff08;yue,第四声&#xff09; 2.对称加密 3.非对称加密 4.公证机构 3.总结 1.为什么要加密&#xff1f;…

systemverilog中位的选择

常用的变量类型就是 reg 和 wire &#xff0c;这两种类型可以定义 一位的变量&#xff0c;也可以定义多位&#xff0c;其中 1 bit 的变量称为 标量(scalar)&#xff0c;多 bit 的变量称为 向量(vector)&#xff0c;如下所示&#xff1a; wire o_nor; // singl…

【树莓派】如何刷个系统给树莓派4B,如何ssh登陆到树莓派

文章目录 下载树莓派镜像下载烧写软件烧写编辑设置连接树莓派4B重启ssh查看树莓派IPssh远程连接问询、帮助 下载树莓派镜像 https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit 下载烧写软件 https://www.raspberrypi.com/software/ 烧写 编辑…

7. Spring Boot 创建与使用

经过前面的六篇文章&#xff0c;Spring Framework的知识终于大致讲完了&#xff0c;但是Spring AOP还没提到&#xff0c;个人认为Spring AOP更适合放在Spring MVC之后再讲解&#xff0c;而讲解Spring MVC前先学习Spring Boot的目的也是为了在学习Spring MVC的时候直接使用Sprin…

EelasticSearch使用

1. Easy-ES介绍 Easy-Es 2. 导入依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions>//排除框架中原有的依赖包<exclusion><groupId>org.elast…

Vue3 + Js + Element-Plus + VueX后台管理系统通用解决方案

前言 本文是作为学习总结而写的一篇文章&#xff0c;也是方便以后有相关需求&#xff0c;可以直接拿来用&#xff0c;也算是记录吧&#xff0c;文中有一些文件的引入&#xff0c;没给出来&#xff0c;完整项目地址&#xff08;后续代码仓库放这里&#xff09; 1、layout解决方…