【C++课程学习】:Data类的实现

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

目录

 🍩1.头文件

🍩2.实现文件:

 🍩3.分析:

🍟3.1Data的构造函数和析构函数:

🍟3.2拷贝构造:


 前言:
类学的差不多的,我们就日期类来对前面类的学习做一个巩固,然后学习一下运算符重载。

 🍩1.头文件

#pragma once
#include<iostream>
#include<stdbool.h>
#include<assert.h>
#include<math.h>
using namespace std;

class Data {
	friend ostream& operator<<(ostream& out, Data& d);
	friend istream& operator>>(istream& in, Data& d);
public:
	//全缺省的构造函数
	Data(int year = 1, int month = 1, int day = 1) {
		_year = year;
		_month = month;
		_day = day;
	}
	//拷贝构造函数
	Data(const Data& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	//运算符重载
	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);
	bool operator!=(const Data& d);
	Data& operator = (const Data& d);

	//日期+天数
	Data& operator+=(int day);
	Data operator+(int day);

	//日期-天数
	Data& operator-=(int day);
	Data operator-(int day);

	//日期的前置和后置++
	Data& operator++();
	Data operator++(int);

	//日期的前置和后置--
	Data& operator--();
	Data operator--(int);

	//日期减日期=相差的天数
	int operator-(const Data& d);

	//void operator<<(ostream& out);


	//内联函数,获取year年第month的天数
	int GetDay(int year, int month) {
		assert(month > 0 && month < 13);
		static int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		//闰年的二月返回29
		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
			return 29;
		return days[month];
	}
	void print() {
		cout << _year << "-" << _month << "-" << _day << endl;
	}

	int Getyear() {
		return _year;
	}
	int Getmonth() {
		return _month;
	}
	int Getday() {
		return _day;
	}
	//析构函数
	~Data() {
		_year = -1;
		_month = -1;
		_day = -1;
	}
private:
	int _year;
	int _month;
	int _day;
};

🍩2.实现文件:

#include"Data.h"
bool Data::operator==(const Data& d) {
	return _year == d._year
		&& _month == d._month
		&& _day == d._day;
}

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

bool Data::operator<=(const Data& d) {
	return (*this == d) || (*this < d);
}

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

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

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

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

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

Data Data::operator-(int day) {
	Data a = *this;
	a -= day;
	return a;
}
Data& Data::operator++() {
	return *this += 1;
}

Data Data::operator++(int) {
	Data a = *this;
	*this += 1;
	return a;
}

Data& Data::operator--() {
	return *this -= 1;
}

Data Data::operator--(int) {
	Data tmp = *this;
	*this -= 1;
	return tmp;
}

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

ostream& operator<<(ostream& out,Data& d){
	out << d._year << "-" << d._month << "-" << d._day << endl;
	return out;
}

istream& operator>>(istream& in, Data& d) {
	in >> d._year >> d._month >> d._day;
	return in;
}

 🍩3.分析:

日期的基本成员就是年(year),月(month),和日(day)。

    int _year;
    int _month;
    int _day;

🍟3.1Data的构造函数和析构函数:

构造函数我们用了全缺省的构造函数:


构造函数:

如果没有传参数的,我们就初始化为1。其实换成year的缺省值换为1970,moth换成1,day换成1,也是可以的,时间戳从这时候开始计时。

   //全缺省的构造函数

Data(int year = 1, int month = 1, int day = 1) {
        _year = year;
        _month = month;
        _day = day;
    }


析构函数:

没有资源要进行清理,我们把类的属性都变为-1。

//析构函数

~Data() {
        _year = -1;
        _month = -1;
        _day = -1;
    }

🍟3.2拷贝构造:

  加上const修饰一下d,只读。

 //拷贝构造函数
    Data(const Data& d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }

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

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

相关文章

力扣40. 组合总和 II

Problem: 40. 组合总和 II 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.创建一个 res 变量存储所有满足条件的组合结果&#xff0c;使用 track 变量记录当前的组合路径&#xff0c;使用 trackSum 变量记录当前路径中元素的和。 2.排序: 对 candidates 数组进…

第7章 用户输入和 while 循环

第7章 用户输入和 while 循环 7.1 函数 input()的工作原理7.1.1 编写清晰的程序7.1.2 使用 int()来获取数值输入7.1.3 求模运算符 7.2 while 循环简介7.2.1 使用 while 循环7.2.2 让用户选择何时退出7.2.3 使用标志7.2.4 使用 break 退出循环7.2.5 在循环中使用 continue7.2.6 …

renren-fast-vue在mac上的运行

被这个折磨好久了&#xff0c;终于成功了。。 版本号-node-14 需要提前执行的命令&#xff0c;希望可以帮助到大家。分别是解决版本在mac m1架构上的不兼容问题&#xff0c;另外解决没有验证码的问题&#xff0c;要注意数据库的配置&#xff0c;账号密码是否正确。 npm inst…

【iOS】YYModel源码阅读笔记

文章目录 前言一、JSON转换库对比二、YYModel性能优化三、YYModel的使用四、架构分析YYClassInfo 剖析 五、流程剖析转换前准备工作 – 将JSON统一成NSDictionary将NSDictionary 转换为Model对象提取Model信息使用NSDictionary的数据填充Model 总结 前言 先前写了JSONModel的源…

【DBA早下班系列】—— 并行SQL/慢SQL 问题该如何高效收集诊断信息

1. 前言 OceanBase论坛问答区或者提交工单支持的时候大部分时间都浪费在了诊断信息的获取交互上&#xff0c;今天我就其中大家比较头疼的SQL问题&#xff0c;给大家讲解一下如何一键收集并行SQL/慢SQL所需要的诊断信息&#xff0c;减少沟通成本&#xff0c;让大家早下班。 2. …

course-nlp——4-regex

本文参考自https://github.com/fastai/course-nlp 正则表达式 在本课中&#xff0c;我们将学习 NLP 工具包中的一个有用工具&#xff1a;正则表达式。 让我们考虑两个激励性的例子&#xff1a; 电话号码问题 假设我们得到了一些包含电话号码的数据&#xff1a; 123-456-7890…

记录项目打包时候找不到本地仓库的依赖的解决方法

进入本地仓库对应jar的目录 删除_remote_reposotories文件即可

Photoshop界面介绍

Adobe Photoshop 2024版&#xff08;通称“Photoshop 2024”或简写为“PS 2024”&#xff09;下载方式【点我获取下载链接】 百度网盘下载https://pan.baidu.com/s/1JmuK8RMHt2Yyb7NFtgO2uQ?pwdSIMS Photoshop界面介绍 Photoshop&#xff0c;简称PS&#xff0c;是Adobe …

【MySQL】存储引擎

https://www.bilibili.com/video/BV1Kr4y1i7ru?p64 https://jimhackking.github.io/%E8%BF%90%E7%BB%B4/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#more MySQL体系结构&#xff1a; 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证…

【代码随想录】【算法训练营】【第35天】 [1005]K次取反后最大化的数组和 [134]加油站 [135]分发糖果

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 35&#xff0c;连休两天~ 题目详情 [1005] K次取反后最大化的数组和 题目描述 1005 K次取反后最大化的数组和 解题思路 前提&#xff1a;数组 思路&#xff1a;优先负数取反&#xff0c;未…

利用AI机器学习,助力发动机舱电磁场强仿真,轻松实现快速预测

当下工业仿真面临的难题&#xff1f; 在使用 Altair Feko 进行空间场强计算时&#xff0c;每次查询新坐标点的场强幅值都需要重新进行计算&#xff0c;这不仅耗时&#xff08;约20-30分钟&#xff09;&#xff0c;而且还需要考虑高级算力的排队时间。这种效率瓶颈严重限制了快速…

springboot三层架构与MVC,以及三层架构入门

三层架构与MVC 1. 三层架构是什么 把各个功能模块划分为表示层&#xff0c;业务逻辑层&#xff0c;和数据访问层三层架构&#xff0c;各层之间采用接口相互访问&#xff0c;并通过对象模型的实体类&#xff08;model&#xff09;作为数据传递的载体&#xff0c;不同的对象模型…

Rust : windows下protobuf和压缩传输方案

此前dbpystream库是用python开发 web api。今天在rust中试用一下protobuf。 本文关键词&#xff1a;编译器、protobuf、proto文件、序列化、zstd压缩&#xff0c;build。 一、 protobuf编译器下载 具体见相关文章。没有编译器&#xff0c;protobuf无法运行。 windows参见&am…

鸿蒙原生开发——轻内核A核源码分析系列三 物理内存(2)

3.1.2.3 函数OsVmPhysLargeAlloc 当执行到这个函数时&#xff0c;说明空闲链表上的单个内存页节点的大小已经不能满足要求&#xff0c;超过了第9个链表上的内存页节点的大小了。⑴处计算需要申请的内存大小。⑵从最大的链表上进行遍历每一个内存页节点。⑶根据每个内存页的开始…

02-DHCP原理与配置

1、DHCP的工作原理 当局域网中有大量的主机时&#xff0c;如果逐个为每一台主机手动设置IP地址、默认网关、DNS服务器地址等网络参数&#xff0c;这显然是一个费力也未必讨好的办法。 而DHCP服务器的应用&#xff0c;正好可以解决这一问题。 1.1 DHCP是什么 DHCP——动态主机…

[2024-06]-[大模型]-[Ollama] 0-相关命令

常用的ollama命令[持续更新中] ollama更新&#xff1a; curl https://ollama.ai/install.sh |sh带着flash attention启动&#xff1a; OLLAMA_FLASH_ATTENTION1 ollama serve停止ollama服务&#xff1a; sudo systemctl stop ollama note&#xff1a;目前遇到sudo systemctl …

驱动开发之 input 子系统

1.input 子系统介绍 input 就是输入的意思&#xff0c;input 子系统就是管理输入的子系统&#xff0c;和 pinctrl、gpio 子系统 一样&#xff0c;都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等 等这些都属于输入设备&#xff0c;不同的输入…

一文教你如何实现并发请求的失败自动重试及重试次数限制

需求 在并发接口请求的时候&#xff0c;能够自动对失败的请求进行重发尝试&#xff08;超过指定重试次数则不再重试&#xff09;,并将最终的结果返回&#xff08;包含每个请求是否成功、返回结果&#xff09; 核心思路 代码实现 使用案例 为了演示我们代码的最终实现效果&a…

使用 python 将 Markdown 文件转换为 ppt演示文稿

在这篇博客中&#xff0c;我们将展示如何使用 wxPython 创建一个简单的图形用户界面 (GUI)&#xff0c;以将 Markdown 文件转换为 PowerPoint 演示文稿。我们将利用 markdown2 模块将 Markdown 转换为 HTML&#xff0c;并使用 python-pptx 模块将 HTML 内容转换为 PowerPoint 幻…

HarmonyOS未来五年的市场展望

一、引言 随着科技的不断进步和消费者对于智能化设备需求的日益增长&#xff0c;操作系统作为连接硬件与软件的核心平台&#xff0c;其重要性愈发凸显。HarmonyOS&#xff08;鸿蒙系统&#xff09;&#xff0c;作为华为自主研发的分布式操作系统&#xff0c;自诞生以来便备受瞩…