C++日期类的实现

news2024/11/26 21:28:23

前言:在类和对象比较熟悉的情况下,我们我们就可以开始制作日期表了,实现日期类所包含的知识点有构造函数,析构函数,函数重载,拷贝构造函数,运算符重载,const成员函数

1.日期类的加减运算

#define _CRT_SECURE_NO_WARNINGS 1
#include"data.h"
class Data
{
public:
	//获取某年某月的天数
	int GetMonthday(int year, int month)
	{
		int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		int day = days[month];
		if (month == 2)
		{
			if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
			{
				day += 1;
			}
		}
		return day;
	}
	Data(int year=1900,int month=1,int day=1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//拷贝构造
	//Data(const Data& d);

	//日期赋值
	Data& operator = (const Data & d) const
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
		return *this;
	}


	Data& operator-=(int day)
	{
		_day -= day;
		while (_day <= 0)
		{
			if (_month == 1)
			{
				_year--;
				_month = 12;
			}
			else
			{
				_month--;
			}
			_day = GetMonthday(_year, _month) + _day;
		}
		return *this;
	}

	Data& operator+=(int day)
	{
		_day += day;
		while (_day > GetMonthday(_year, _month))
		{
			_day = _day - GetMonthday(_year, _month);
			_month++;
			if (_month == 13)
			{
				_year++;
				_month = 1;
			}
		}
		return *this;
	}

	void Print(const Data& d)
	{
		cout << _year << "年" << _month << "月" << _day << "日" << endl;
	}
	

private:
	int _year;
	int _month;
	int _day;

};



int main()
{
	Data d1(2023,12,31);
	Data d2(d1);
    
	d2 = d2.operator+=(10000);
	d2.Print(d2);
	return 0;
}

2 日期类的运算符重载

类里面有默认的拷贝构造函数(不显含),还有默认的构造函数(不显含),你也可以把这个默认的构造函数写出来,只是不显含的构造函数对类里面的内置类型不做处理,自定义类型会调用它的构造函数,就会处理一下。

//日期赋值
Data& operator = (const Data & d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
	return *this;
}


Data& operator-=(int day)
{
	_day -= day;
	while (_day <= 0)
	{
		if (_month == 1)
		{
			_year--;
			_month = 12;
		}
		else
		{
			_month--;
		}
		_day = GetMonthday(_year, _month) + _day;
	}
	return *this;
}

Data& operator+=(int day)
{
	_day += day;
	while (_day > GetMonthday(_year, _month))
	{
		_day = _day - GetMonthday(_year, _month);
		_month++;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}
	}
	return *this;
}

Data& operator++()//前置++
{
	_day++;
	if (_day > GetMonthday(_year, _month))
	{
		_day = _day - GetMonthday(_year, _month);
		_month++;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}
		
	}
	return *this;
}

Data& operator++(int)//后置++
{
	Data d = *this;
	++_day;
	return d;
}

//运算符重载,比较两个日期的大小
bool operator>(const Data& d)
{
	return ((_year > d._year) || (_year==d._year&&_month > d._month) || (_year == d._year && _month == d._month&&_day > d._day));
}

bool operator>=(const Data& d)
{
	return !((_year < d._year) || (_year == d._year && _month < d._month) || (_year == d._year && _month == d._month && _day < d._day));
}

bool operator<(const Data& d)
{
	return ((_year < d._year) || (_year == d._year && _month < d._month) || (_year == d._year && _month == d._month && _day < d._day));
}

bool operator<=(const Data& d)
{
	return !((_year > d._year) || (_year > d._year && _month > d._month) || (_year == d._year && _month == d._month && _day > d._day));

}

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

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

3 我们将运算符重载的函数和两个日期相差的天数进行配合计算

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

int main()
{
	Data d1(2023,12,31);
	//Data d2(d1);
	Data d2(1900,11,30);
    
	//d2 = d2.operator+=(10000);
	d2.Print(d2);
	cout << d2.operator-(d1) << endl;
	return 0;
}

所有源码的实现如下

data.h


#pragma once
#include<iostream>
using namespace std;
class Data
{
public:
	//获取某年某月的天数
	int GetMonthday(int year, int month)
	{
		int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		int day = days[month];
		if (month == 2)
		{
			if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
			{
				day += 1;
			}
		}
		return day;
	}
	Data(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//拷贝构造
	//Data(const Data& d);

	//日期赋值
	Data& operator = (const Data& d);


	Data& operator-=(int day);
	
	Data& operator+=(int day);
	

	Data& operator++();//前置++
	

	Data& operator++(int);//后置++
	

	//运算符重载,比较两个日期的大小
	bool operator>(const Data& d);

	bool operator>=(const Data& d);

	bool operator<(const Data& d);

	bool operator<=(const Data& d);

	bool operator!=(const Data& d);

	int operator-(Data& d);

	void Print(const Data& d);


private:
	int _year;
	int _month;
	int _day;

};



data.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include"data.h"
Data& Data::operator = (const Data& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
	return *this;
}


Data& Data::operator-=(int day)
{
	_day -= day;
	while (_day <= 0)
	{
		if (_month == 1)
		{
			_year--;
			_month = 12;
		}
		else
		{
			_month--;
		}
		_day = GetMonthday(_year, _month) + _day;
	}
	return *this;
}

Data& Data::operator+=(int day)
{
	_day += day;
	while (_day > GetMonthday(_year, _month))
	{
		_day = _day - GetMonthday(_year, _month);
		_month++;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}
	}
	return *this;
}

Data& Data::operator++()//前置++
{
	_day++;
	if (_day > GetMonthday(_year, _month))
	{
		_day = _day - GetMonthday(_year, _month);
		_month++;
		if (_month == 13)
		{
			_year++;
			_month = 1;
		}

	}
	return *this;
}

Data& Data::operator++(int)//后置++
{
	Data d = *this;
	++_day;
	return d;
}

//运算符重载,比较两个日期的大小
bool Data::operator>(const Data& d)
{
	return ((_year > d._year) || (_year == d._year && _month > d._month) || (_year == d._year && _month == d._month && _day > d._day));
}

bool Data::operator>=(const Data& d)
{
	return !((_year < d._year) || (_year == d._year && _month < d._month) || (_year == d._year && _month == d._month && _day < d._day));
}

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

bool Data::operator<=(const Data& d)
{
	return !((_year > d._year) || (_year > d._year && _month > d._month) || (_year == d._year && _month == d._month && _day > d._day));

}

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

int Data::operator-(Data& d)
{

	Data max = *this;
	Data min = d;
	int flag = 1;
	if (*this < d)
	{
		max = d;
		min = *this;
		flag = -1;
	}
	int n = 0;
	while (min != max)
	{
		++min;
		++n;
	}
	return flag * n;
}

void Data::Print(const Data& d)
{
	cout << _year << "年" << _month << "月" << _day << "日" << endl;
}



int main()
{
	Data d1(2023,12,31);
	//Data d2(d1);
	Data d2(1900,11,30);
    
	//d2 = d2.operator+=(10000);
	d2.Print(d2);
	cout << d2.operator-(d1) << endl;
	return 0;
}

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

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

相关文章

pyqt5用qtdesign设计页面时,去掉页面的空白界面、边框和标题栏

前言 Windows默认的标题栏有时候自己觉得不太美观&#xff0c;就想自己设计一个&#xff0c;然后把默认的去掉&#xff0c;并且把长方形的边框和多余的空表界面去掉&#xff0c;就是下图中圈出来的区域&#xff1a; 去掉之后的效果如图&#xff1a; 这样我们就可以自定义窗…

SpringBoot + Vue 抖音全平台项目

简介 本项目是一个短视频平台&#xff0c;拥有热度排行榜&#xff0c;热门视频&#xff0c;兴趣推送&#xff0c;关注推送&#xff0c;内容审核等功能。 源码下载 网盘 (访问密码: 8418) 登录/注册 首页 创作中心 架构设计 上传视频业务流程 视频推送流程 1.用户订阅分类后…

OSPFv2 LSA类型

OSPFv2需要了解的6种LSA&#xff0c;分别是&#xff1a;1类LSA、2类LSA、3类LSA、4类LSA、5类LSA、7类LSA。 我们先了解一下LSA的组成&#xff0c;LSA由LSA头部和LSA内容组成&#xff0c;其中LSA头部是每一类LSA都相同的&#xff0c;有Type&#xff08;LSA的类型&#xff09;、…

iMazing 2 .17.16最新官方中文版免费下载安装激活

iMazing 2 .17.16最新版是一款帮助用户管理IOS手机的应用程序&#xff0c;iMazing2最新版能力远超iTunes提供的终极的iOS设备管理器。IMazing与你的iOS设备(iPhone、 iPad或iPod)相连&#xff0c;使用起来非常的方便。作为苹果指定的iOS设备同步工具。 mazing什么意思 iMazing…

软件推荐:MobaXterm

介绍 MobaXterm 是远程计算的终极工具箱&#xff0c;它提供了几乎所有重要的远程网络工具&#xff0c;SSH、RDP、FTP、VNC&#xff0c;只要你能想到的&#xff0c;都可以在MobaXterm中找到。除了海量协议外&#xff0c;MobaXterm 还支持安装额外的插件来扩展其功能。 软件官网…

深度学习核心技术与实践之自然语言处理篇

非书中全部内容&#xff0c;只是写了些自认为有收获的部分。 自然语言处理简介 NLP的难点 &#xff08;1&#xff09;语言有很多复杂的情况&#xff0c;比如歧义、省略、指代、重复、更正、倒序、反语等 &#xff08;2&#xff09;歧义至少有如下几种&#xff1a; …

Linux学习第49天:Linux块设备驱动实验(一):Linux三大驱动之一

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章学习Linux三大驱动之一的块设备驱动&#xff0c;主要应用场景为存储设备。 本章的思维导图如下&#xff1a; 一、什么是块设备 块设备---存储设备 以块为单位…

经典目标检测YOLO系列(一)复现YOLOV1(3)正样本的匹配及损失函数的实现

经典目标检测YOLO系列(一)复现YOLOV1(3)正样本的匹配及损失函数的实现 之前&#xff0c;我们依据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;提出了新的YOLOV1架构&#xff0c;并解决前向推理过程中的两个问题&#xff0c;继续按照此书进行YOLOV1的复现。 经典目标…

数据结构OJ实验8-赫夫曼树编码及应用

A. DS二叉树--赫夫曼树的构建与编码 题目描述 给定n个权值&#xff0c;根据这些权值构造huffman树&#xff0c;并进行huffman编码 大家参考课本算法6.12为主&#xff0c;注意数组访问是从位置1开始 要求&#xff1a;赫夫曼的构建中&#xff0c;默认左孩子权值不大于右孩子权…

webRTC实时通信demo

参考文档&#xff1a; https://www.jianshu.com/p/f439ce5cc0be https://www.w3cschool.cn/socket demo流程示意图&#xff08;用户A向用户B推送视频&#xff09;&#xff1a; #mermaid-svg-0KZaDQ5DBl28zjmZ {font-family:"trebuchet ms",verdana,arial,sans-seri…

JavaWeb——前端之HTMLCSS

学习视频链接&#xff1a;https://www.bilibili.com/video/BV1m84y1w7Tb/?spm_id_from333.999.0.0 一、Web开发 1. 概述 能通过浏览器访问的网站 2. Web网站的开发模式——主流是前后端分离 二、前端Web开发 1. 初识 前端编写的代码通过浏览器进行解析和渲染得到我们看到…

elasticsearch+Kibana

什么是es(elasticsearch) Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;它构建在Apache Lucene搜索引擎库之上。它提供了一个分布式多用户能力的实时搜索和分析引擎&#xff0c;能够处理大规模的数据。Elasticsearch被广泛用于构建全文搜索、日志分析、实时应用…

灸哥问答:软件架构在软件研发中的作用

软件架构在软件开发中扮演着至关重要的角色。我们在软件研发的过程中&#xff0c;类比于建造一座公寓楼&#xff0c;而软件架构就像是盖楼之前的设计图纸&#xff0c;如果没有设计图纸就直接盖楼&#xff0c;可想而知带来的后果是什么。我对软件架构的作用表现总结如下&#xf…

iOS问题记录 - iOS 17通过NSUserDefaults设置UserAgent无效(续)

文章目录 前言开发环境问题描述问题分析1. 准备源码2. 定位源码3. 对比源码4. 分析总结 解决方案补充内容1. UserAgent的组成2. UserAgent的设置优先级 最后 前言 在上篇文章中对该问题做了一些判断和猜测&#xff0c;并给出了解决方案。不过&#xff0c;美中不足的是没有进一…

十四:爬虫-Redis基础

1、背景 随着互联网大数据时代的来临&#xff0c;传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力&#xff0c;来解决系统性能上的瓶颈。 2、redis是什么 Redis 全称 Remote Dictio…

C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)

本文主要介绍回调函数的使用&#xff0c;包括函数指针、异步回调编程、主要通过详细的例子来指导在异步编程和事件编程中如何使用回调函数来实现。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;C/C精进之路 &…

【Spring实战】16 Profile

文章目录 1. 定义2. 使用2.1 定义 Profile2.2 激活 Profile 3. 演示3.1 properties文件3.2 打印日志3.3 启动服务&验证3.4 修改 active3.5 重启服务&验证 4. 应用场景4.1 数据库配置4.2 日志配置 5. 代码详细总结 Spring 框架提供了一种强大的机制&#xff0c;允许在不…

图像分割实战-系列教程9:U2NET显著性检测实战1

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 U2NET显著性检测实战1 1、任务概述

第7课 利用FFmpeg将摄像头画面与麦克风数据合成后推送到rtmp服务器

上节课我们已经拿到了摄像头数据和麦克风数据&#xff0c;这节课我们来看一下如何将二者合并起来推送到rtmp服务器。推送音视频合成流到rtmp服务器地址的流程如下&#xff1a; 1.创建输出流 //初始化输出流上下文 avformat_alloc_output_context2(&outFormatCtx, NULL, &…

Java EE Servlet之Cookie 和 Session

文章目录 1. Cookie 和 Session1.1 Cookie1.2 理解会话机制 (Session)1.2.1 核心方法 2. 用户登录2.1 准备工作2.2 登录页面2.3 写一个 Servlet 处理上述登录请求2.4 实现登录后的主页 3. 总结 1. Cookie 和 Session 1.1 Cookie cookie 是 http 请求 header 中的一个属性 浏…