C++类与对象基础(5)——日期类的实现

       对于实现日期类中需要用到的例如:构造函数,析构函数,运算符重载等内容,已经在前面几篇文章中进行介绍,故本文只给出关于类和对象中日期类的代码实现,对于代码的原理不给予详细的解释:

1.头文件violent.h:

#pragma once

#include<stdio.h>
#include<iostream>
#include<assert.h>
#include<stdbool.h>

using std::cout;
using std::cin;
using std::endl;


class Date
{
public:

	//构造函数:函数名与类名相同,没有返回值,可以构成重载,自动调用
	//针对内置类型不做处理,针对自定义类型会自动调用其自己的构造函数
	Date(int year = 1, int month = 1, int day = 1);


	//拷贝构造函数,对于日期类可以不写
	//拷贝构造函数针对内置类型会完成值拷贝,针对自定义类型会自动调用其自己的拷贝构造函数
	//Date(Date& d1)
	//{
	//	_year = 2024;
	//	_month = 1;
	//	_day = 6;
	//}

	

	//类的比较运算函数
	bool operator==(Date& d);
	bool operator!=(Date& d);
	bool operator>(Date& d);
	bool operator>=(Date& d);
	bool operator<=(Date& d);
	bool operator<(Date& d);
	
	//获取年月份对应的日期
	int GetMonthDay(int _year, int _month);
	void Print();

	Date& operator+=(int day);
	Date operator+(int day);
	Date& operator-=(int day);
	Date operator-(int day);
	Date& operator++();
	Date operator++(int);
	Date& operator--();
	Date operator--(int);
	int operator-(Date& d);


	//析构函数,不是清除对象,而是对对象中的资源进行清理,作用方式与构造函数类似,针对内置类型不作用
	//针对自定义类型会调用自己的析构函数
	//函数名是类名之前加上波浪线,每个类中只能存在一个析构函数,类生命周期结束会自动调用,不能构成重载
	~Date();
	
	



private:
	int _year;
	int _month;
	int _day;
};

2.函数功能实现文件violent.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include"violent.h"

//构造函数
Date::Date(int year, int month, int day)
{
	if ((year < 1) || (month > 12) || (month < 1) || (day < 1))
	{
		cout << "日期信息非法" << endl;
	}
	_year = year;
	_month = month;
	_day = day;
}
//析构函数
Date:: ~Date()
{
	_year = 0;
	_month = 0;
	_day = 0;
}


void Date::Print()
{
	cout << _year << " " << _month << " " << _day << endl;
}
bool Date::operator==(Date& d)
{
	return _year == d._year 
		&& _month == d._month 
		&& _day == d._day;
}

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

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

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

bool Date::operator<=(Date& d)
{
	return !(*this > d);
}

bool Date::operator<(Date& d)
{
	return !(*this >= d);

}

int Date::GetMonthDay(const int _year,const int _month)
{
	int Day[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 Day[_month];
}

//运算符重载:+=(会改变类)
Date& Date::operator+=(int day)
{
	_day = _day + day;

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

		_month++;
		if (_month > 12)
		{
			_month = 0;
			_year++;
		}
	}

	return (*this);
}

Date Date::operator+(int day)
{
	Date tmp(*this);

	tmp = tmp += day;

	return tmp;
}

Date& Date::operator-=(int day)
{
	_day = _day - day;

	while (_day <= 0)
	{
		_month--;
		if (_month == 0)
		{
			_year--;
			_month = 12;
		}
		_day = _day + GetMonthDay(_year, _month);	
	}

	return (*this);
}

Date Date::operator-(int day)
{
	Date tmp(*this);

	tmp = (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--()
{
	*this -= 1;

	return (*this);
}

Date Date::operator--(int)
{
	Date tmp(*this);

	(*this) -= 1;

	return tmp;
}

int Date::operator-(Date& d)
{
	int flag = 1;
	Date max = (*this);
	Date min = (d);

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

	return n * flag;
}

3.功能测试文件Test.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include"violent.h"

void Test1()
{
	Date d1(2024,1,6);
	d1.Print();

	Date d2(2024, 1, 6);
	d2.Print();

	Date d3(2024, 1, 15);

	cout << "测试结果校验: ==" << endl;
	bool ret =(d1==d2);
	cout << " ret = " << ret << endl;

	cout << "测试结果校验: != " << endl;
	bool ret1 = (d2 != d1);
	cout << " ret1 = " << ret1 << endl;

	cout << "测试结果校验:>" << endl;
	bool ret2 = (d3 > d1);
	cout << " ret3 =  " << ret2 << endl;

	cout << "测试结果校验: >=" << endl;
	bool ret3 = (d3 >= d1);
	bool ret4 = (d2 >= d1);
	cout << " ret3 = " << ret3 << endl << "ret4 = " << ret4 << endl;

	cout << "测试结果校验: <=" << endl;
	bool ret5 = (d1 <= d3);
	bool ret6 = (d2 <= d1);
	cout << " ret5 = " << ret5 << endl << " ret6 = " << ret6 << endl;

	cout << "测试结果校验: <" << endl;
	bool ret7 = (d2 < d3);
	cout << "ret7 = " << ret7 << endl;
}

void Test2()
{

	cout << endl << " 下面内容为Test2中的测试" << endl;
	Date dd(2024, 1, 6);
	dd.Print();
	Date dd1(2024, 1, 6);

	cout << "测试+=" << endl;
	Date ret1 = (dd += 100);
	ret1.Print();

	cout << "测试+" << endl;
	Date ret2 = (dd1 + 100);
	ret2.Print();

	cout << "测试-=" << endl;
	Date ret3 = (dd -= 100);
	ret3.Print();

	cout << "测试-" << endl;
	Date ret4 = (dd1 - 100);
	ret4.Print();
}

void Test3()
{
	cout << endl << " 下面内容为Test3中的测试" << endl;
	Date d3(2024, 1, 6);
	cout << " 测试++d" << endl;
	Date ret1 = (++d3);
	Date d4(2024, 1, 6);

	ret1.Print();
	cout << " 测试d++" << endl;
	Date ret2 = (d4++);
	ret2.Print();
}

void Test4()
{
	cout << endl << " 下面内容为Test4中的测试" << endl;
	Date d(2024, 1, 6);
	Date d2(2024, 1, 6);
	cout << "测试--d" << endl;
	Date ret1 = (--d);
	ret1.Print();
	cout << "测试d--" << endl;
	Date ret2 = (d2--);
	ret2.Print();
}

void Test5()
{
	Date d1(2024, 1, 6);
	Date d2(2024, 4, 15);

	int ret1 = d2 - d1;

	cout << ret1 << endl;
}
int main()
{
	Test1();

	Test2();

	Test3();	

	Test4();

	Test5();
}

4. 代码运行结果展示:

 

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

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

相关文章

[VUE]1-创建vue工程

目录 基于脚手架创建前端工程 1、环境要求 2、操作过程 3、工程结构 4、启动前端服务 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c…

Commander One for Mac:强大的双窗格文件管理器,让你的工作效率倍增!

Commander One for Mac是一款功能强大的文件管理工具&#xff0c;具有以下主要功能&#xff1a; 双窗格设计&#xff1a;主界面分为两个窗格&#xff0c;用户可以在左侧窗格中导航和浏览文件系统的目录结构&#xff0c;在右侧窗格中查看文件和文件夹的内容。文件操作&#xff…

Java:结束本机端口被占用进程

前言 在实际开发当中我们&#xff0c;往往在idea中将某个服务的启动给关闭了&#xff0c;但是在nacos的某个服务上&#xff0c;我们却可以看到本地别名服务还是在上面挂载着本地再次启动的时候就提示【端口被占用】&#xff0c;今天就说一下如何解决这个问题 操作 点击即可预…

C++_命令行操作

命令行操作 介绍第一步编译 源码第二部 找到exe 可执行文件第三步看图操作代码测试源码测试结果 介绍 本文介绍命令行操作 1.argc 表示当前输入 参数个数 2.argv 表示当前输入 字符串内容 第一步编译 源码 #include<iostream> #include<string>using namespace st…

el-table 展开行表格,展开的内容高度可以变化时,导致的固定列错位的问题

问题描述 一个可展开的表格&#xff08;列设置了type“expand”&#xff09;&#xff0c;并且展开后的内容高度可以变化&#xff0c;会导致后面所有行的固定列错位&#xff0c;图如下&#xff0c;展示行中是一个树形表格&#xff0c;默认不展示子级&#xff0c;点击树形表格的…

R4S软路由如何在iStoreOS后配置远程桌面本地电脑公网地址

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…

斑马斑马跳

欢迎来到程序小院 斑马斑马跳 玩法&#xff1a;行走的斑马&#xff0c;点击鼠标左键斑马左右跳动&#xff0c;左右两侧有大树&#xff0c;和移动的小鸟&#xff0c; 撞到大树和小鸟游戏结束&#xff0c;统计分数&#xff0c;快去斑马跳吧^^。开始游戏https://www.ormcc.com/pl…

项目总体测试计划书

一、 前言 &#xff08;一&#xff09; 背景 &#xff08;二&#xff09; 目的 &#xff08;三&#xff09; 测试目标 &#xff08;四&#xff09; 适用范围与读者对象 &#xff08;五&#xff09; 术语与缩写 二、 软件测试实施流程 &#xff08;一&#xff09; 测试工作总体流…

系统编程--VIM特辑

这里写目录标题 vim三种工作模式进入文本模式的快捷键在命令模式下进行文本编辑删除快捷键复制粘贴查找替换查找替换 vim其他操作 vim打造简易IDE vim 三种工作模式 具体可见第二章对vim的详细介绍 需要注意的是&#xff0c;在末行模式下执行完一次命令&#xff0c;就可以直接…

RTTI结构详细分析(VC++)

对于RTTI结构的资料真的屈指可数,类的逆向也一直是一个不好弄的问题.对此我只想贡献我的一份力量。 文中我不会分析类的内存布局,因为有很多资料已经分析的挺好的了(见参考资料)。但是现有我能找到的资料对RTTI结构的表述不完整,或者表述模糊不清,参考Clang的部分源码后&#…

什么是VR、AR、MR、XR?

VR、AR、MR、XR的定义 VR虚拟现实是利用计算机技术创造虚拟世界&#xff0c;用户可以通过穿戴VR设备&#xff0c;进入虚拟现实的环境&#xff0c;感受身临其境的体验。 AR增强现实技术是将现实和虚拟世界结合在一起&#xff0c;用户可以通过手机、平板电脑等设备&#xff0c;看…

Weblogic安全漫谈(四)

黑名单机制必然会推动两种研究方向的发展&#xff1a;一是挖掘不在黑名单的新组件&#xff0c;是为绕过规则&#xff1b;二是发掘检查的盲区&#xff0c;是为绕过逻辑。 CVE-2020-14756 二次反序列化具有对抗检查逻辑的天生丽质&#xff0c;在CVE-2018-2893中就有利用字节数组…

文件夹重命名:如何一键完成简体中文文件夹名到繁体中文的批量转换

随着科技的发展&#xff0c;人类越来越依赖计算机和电子设备进行文件管理。在这个过程中&#xff0c;经常会遇到要将简体中文文件夹名转换为繁体中文的情况。这有助于统一文件名的格式&#xff0c;也能提高文件的可读性和检索性。那如何一键完成简体中文文件夹名到繁体中文的批…

【精通C语言】:分支结构switch语句的灵活运用

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C语言详解 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、switch语句1.1 语法1.2 代码示例 二、switch的控制语句2.1 break2.2 defualt子句 三、…

前端下载文件问题之如何获取报错信息

问题&#xff1a;点击下载后。接口会生成并返回文件流。在极端情况下接口数据返回异常&#xff0c;需要抛出错误信息&#xff0c;比如后端拼接错误情况、空文件情况。 难点&#xff1a;responseType设置为Blob后&#xff0c;返回内容为二进制文件流&#xff0c;从而无法获取错误…

03、Kafka ------ CMAK(Kafka 图形界面管理工具) 下载、安装、启动

目录 CMAK&#xff08;Kafka 图形界面管理工具&#xff09;下载安装启动打开 cmak 图形界面 CMAK&#xff08;Kafka 图形界面管理工具&#xff09; Kafka本身并没有提供Web管理工具&#xff0c;而是推荐使用bin目录下各种工具命令来管理Kafka&#xff0c; 这些工具命令其实用起…

安达发|基于APS排程系统的PDM功能

APS系统&#xff08;Advanced Planning and Scheduling&#xff0c;先进计划与排程&#xff09;是一种基于APS系统&#xff08;Advanced Planning and Scheduling&#xff0c;先进计划与排程&#xff09;是一种基于供应链管理和生产管理的综合性软件系统。它通过整合企业内外部…

安达发APS排产软件之PDM产品工艺数据管理

PDM&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;是一种用于管理产品全生命周期内所有与产品相关的信息和数据的技术。在制造业中&#xff0c;PDM系统被广泛应用于产品工艺数据管理&#xff0c;以提高生产效率、降低成本、保证产品质量和缩短产品上…

Vue3+Pinia实现持久化动态主题切换

PC端主题切换大家都用过&#xff0c;下面用Vue3Pinia实现一下这个过程; 【源码地址】 1、准备工作 npm install pinia npm install pinia-plugin-persist2、基础配置 // main.js import { createApp } from vue import App from ./App.vue import bootstrap from "../bo…

Java面向对象(抽象类,接口,内部类)

文章目录 今日内容教学目标 第一章 抽象类1.1 概述1.1.1 抽象类引入 1.2 abstract使用格式1.2.1 抽象方法1.2.2 抽象类1.2.3 抽象类的使用 1.3 抽象类的特征1.4 抽象类的细节1.5 抽象类存在的意义 第二章 接口2.1 概述2.2 定义格式2.3 接口成分的特点2.3.1.抽象方法2.3.2 常量2…