C++日期类的完整实现,以及this指针的const修饰等的介绍

news2024/12/28 4:15:58

文章目录

  • 前言
  • 一、日期类的实现
  • 二、this指针的const修饰
  • 总结


前言

C++日期类的完整实现,以及this指针的const修饰等的介绍


一、日期类的实现

// Date.h
#pragma once

#include <iostream>
using namespace std;

#include <assert.h>

class Date
{
	// 友元函数
	friend ostream& operator<<(ostream& out, const Date& d);
	friend istream& operator>>(istream& in, Date& d);
public:
	// 构造函数
	Date(int year = 1970, int month = 1, int day = 1);

	void Print() const
	{
		cout << _year << '-' << _month << '-' << _day << endl;
	}

	// 拷贝构造函数
	Date(const Date& d);

	// 析构函数
	~Date();

	// 赋值运算符重载
	Date& operator=(const Date& d);

	// 运算符重载
	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;

	// 获取每月天数
	int GetMonthDay(int year, int month);

	// + += - -= 天数
	Date& operator+=(const int day);
	Date operator+(const int day) const;
	Date& operator-=(const int day);
	Date operator-(const int day) const;

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

	// 后置++
	Date operator++(int);

	// 前置--
	Date& operator--();

	// 后置--
	Date operator--(int);

	// 日期-日期
	int operator-(const Date& d) const;

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



// 流插入
ostream& operator<<(ostream& out, const Date& d);

// 流提取
istream& operator>>(istream& in, Date& d);


// Date.cpp
#define  _CRT_SECURE_NO_WARNINGS

#include "Date.h"

// 构造函数
Date::Date(int year, int month, int day)
{
	if (month > 0 && month < 13 && day > 0 && day <= GetMonthDay(year, month))
	{
		_year = year;
		_month = month;
		_day = day;
	}
	else
	{
		cout << "非法日期" << endl;
		assert(false);
	}

}

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


// 析构函数
Date::~Date()
{
	_year = 0;
	_month = 0;
	_day = 0;
}


// 赋值运算符重载
Date& Date::operator=(const Date& d)
{
	if (this != &d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

	return *this;
}

// 运算符重载
bool Date::operator<(const Date& d) const
{
	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==(const Date& d) const
{
	if (_year != d._year)
	{
		return false;
	}
	else if (_year == d._year && _month != d._month)
	{
		return false;
	}
	else if (_year == d._year && _month == d._month && _day != d._day)
	{
		return false;
	}
	else
	{
		return true;
	}
}


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


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


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

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


// 获取月份天数
int Date::GetMonthDay(int year, int month)
{
	static int dayArray[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;
	}
	else
	{
		return dayArray[month];
	}
}

// + += - -= 天数
Date& Date::operator+=(const 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+(const int day) const
{
	Date tmp(*this);

	tmp += day;

	return tmp;
}


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

	return *this;
}
Date Date::operator-(const 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--()
{
	*this -= 1;
	return *this;
}

// 后置--
Date Date::operator--(int)
{
	Date tmp = *this;
	*this -= 1;
	return tmp;
}


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

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

	return num * flag;
}


ostream& operator<<(ostream& out, const Date& d)
{
	out << d._year << "年" << d._month << "月" << d._day << "日" << endl;

	return out;
}

istream& operator>>(istream& in, Date& d)
{
	int year, month, day;
	in >> year >> month >> day;
	if (month > 0 && month < 13 && day > 0 && day <= d.GetMonthDay(year, month))
	{
		d._year = year;
		d._month = month;
		d._day = day;
	}
	else
	{
		cout << "非法日期" << endl;
		assert(false);
	}


	return in;
}

// test.cpp
#define  _CRT_SECURE_NO_WARNINGS

#include "Date.h"

void TestDate1()
{
	Date d1(2023, 9, 1);
	Date d2(2000, 1, 1);
	Date d3(2000, 3, 1);

	cout << (d1 < d2) << endl;
	cout << (d1 == d2) << endl;
	cout << (d2 == d3) << endl;
	cout << (d1 <= d2) << endl;
	cout << (d1 > d2) << endl;
	cout << (d2 <= d3) << endl;
	cout << (d2 > d3) << endl;

	Date d4(1949, 10, 1);
	Date d5(1949, 10, 1);
	cout << (d4 != d5) << endl;
}

void TestDate2()
{
	Date d1(2024, 5, 5);

	d1 += 1000;
	d1.Print();

	Date d2(2024, 10, 1);
	(d2 + 100).Print();

	Date d3(2024, 12, 31);
	d3 -= 100;
	d3.Print();
}


void TestDate3()
{
	Date d1(2024, 5, 5);
	Date d2(2050, 12, 30);

	cout << d1 - d2 << endl;
	cout << d2 - d1 << endl;
}

void TestDate4()
{
	Date d1(2024, 5, 5);
	Date d2(2050, 12, 30);
	Date d3(1328, 1, 4);

	d1 = d2 = d3;
}


void TestDate5()
{
	Date d1(2024, 5, 5);
	Date d2(2050, 12, 30);
	Date d3(1328, 1, 4);

	d1 += 1000;

	d2 -= 50;

	d3 += 500;

	cout << d1;
	cout << d2;
	cout << d3;
}

void TestDate6()
{
	Date d1;
	Date d2;

	cin >> d2 >> d1;
	cout << d1 << d2;

}


void TestDate7()
{
	Date d1(1328, 1, 1);
	d1.Print();


	const Date d2(1368, 1, 4);
	d2.Print();

}


void TestDate8()
{
	Date d1(1328, 1, 1);

	const Date d2(1368, 1, 4);

	cout << (d1 < d2) << endl;

}

int main()
{
	TestDate8();
	
	return 0;
}

二、this指针的const修饰

// 简单的日期类
#include <iostream>
using namespace std;

class Date
{
public:
	Date(int year = 1368, int month = 1, int day = 4)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void Print() 
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

	~Date()
	{
		_year = 0;
		_month = 0;
		_day = 0;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(1949, 10, 1);
	d1.Print();

	const Date d2(1945, 8, 15);
	d2.Print();
	

	return 0;
}

上述日期类实现无法打印d2,原因如下:
使用const修饰创建类,使d2在调用Print函数时,传入的this指针是有const修饰的,与日期类定义类型冲突,所以报错。如下:
在这里插入图片描述

修改如下:

	void Print() const
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

使this指针变为const修饰,需要在成员函数名后加const修饰。

在这里插入图片描述


总结

C++日期类的完整实现,以及this指针的const修饰等的介绍

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

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

相关文章

利用Python控制终端打印字体的颜色和格式

利用Python控制终端打印字体的颜色和格式—操作详解&#xff08;ANSI转义序列&#xff09; 一、问题描述二、ANSI转义序列三、具体代码和显示效果&#xff08;看懂这段代码&#xff0c;以后可随心控制字体的打印格式&#xff09; 欢迎学习交流&#xff01; 邮箱&#xff1a; z……

ONLYOFFICE 桌面编辑器 8.1 版发布:全面提升文档处理效率的新体验

文章目录 什么是ONLYOFFICE &#xff1f;ONLYOFFICE 桌面编辑器 8.1 发布&#xff1a;新功能和改进功能强大的 PDF 编辑器幻灯片版式功能从右至左语言支持多媒体功能增强无缝切换工作模式其他改进和优化总结 什么是ONLYOFFICE &#xff1f; https://www.onlyoffice.com/zh/off…

光伏发电项目是如何提高开发效率的?

随着全球对可再生能源需求的持续增长&#xff0c;光伏发电项目的高效开发成为关键。本文将深入探讨如何在实际操作中提高光伏发电项目的开发效率。 一、优化选址流程 1、数据收集与分析&#xff1a;利用卫星地图和遥感技术&#xff0c;收集目标区域的光照资源、地形地貌、阴影…

【图像分类】Yolov8 完整教程 |分类 |计算机视觉

目标&#xff1a;用YOLOV8进行图像分类。 图像分类器。 学习资源&#xff1a;https://www.youtube.com/watch?vZ-65nqxUdl4 努力的小巴掌 记录计算机视觉学习道路上的所思所得。 1、文件结构化 划分数据集&#xff1a;train,val,test 知道怎么划分数据集很重要。 文件夹…

OSI七层模型TCP/IP四层面试高频考点

OSI七层模型&TCP/IP四层&面试高频考点 1 OSI七层模型 1. 物理层&#xff1a;透明地传输比特流 在物理媒介上传输原始比特流&#xff0c;定义了连接主机的硬件设备和传输媒介的规范。它确保比特流能够在网络中准确地传输&#xff0c;例如通过以太网、光纤和无线电波等媒…

等保测评初级简答题试题

基本要求&#xff0c;在应用安全层面的访问控制要求中&#xff0c;三级系统较二级系统增加的措施有哪些&#xff1f; 答&#xff1a;三级比二级增加的要求项有&#xff1a; 应提供对重要信息资源设置敏感标记的功能&#xff1b; 应按照安全策略严格控制用户对有敏感标记重要…

MySQL高级-索引-使用规则-单列索引联合索引

文章目录 1、单列索引2、联合索引3、查看表索引4、创建 name 和 phone 索引5、查询 phone17799990010 and name韩信6、执行计划 phone17799990010 and name韩信7、创建联合唯一索引 idx_user_phone_name8、再次执行计划 phone17799990010 and name韩信9、使用了USE INDEX提示来…

为什么叫云计算?云计算的优势有哪些

说起云计算大家并不会感到陌生&#xff0c;那么为什么叫云计算&#xff1f;云计算技术的引入通常会使企业的信息技术应用更高效、更可靠、更安全。云计算支持用户在任意位置、使用各种终端获取应用服务。使用了数据多副本容错、计算节点同构可互换等措施来保障服务的高可靠性&a…

从RLHF到DPO再到TDPO,大模型对齐算法已经是「token-level」

在人工智能领域的发展过程中&#xff0c;对大语言模型&#xff08;LLM&#xff09;的控制与指导始终是核心挑战之一&#xff0c;旨在确保这些模型既强大又安全地服务于人类社会。早期的努力集中于通过人类反馈的强化学习方法&#xff08;RLHF&#xff09;来管理这些模型&#x…

mmdetection2.28修改backbone不使用预训练参数、从头训练

背景 最近需要测试一下在backbone部分如果不使用预训练参数的话&#xff0c;模型需要多少轮才能收敛所使用的backbone是mmcls.ConvNeXtmmdetection版本为2.28.2&#xff0c;mmcls版本为0.25.0 修改流程 最简单的方法&#xff0c;直接去mmcls的model zoo里找到对应backbone的…

新能源汽车CAN总线故障定位与干扰排除的几个方法

CAN总线是目前最受欢迎的现场总线之一,在新能源车中有广泛应用。新能源车的CAN总线故障和隐患将影响驾驶体验甚至行车安全,如何进行CAN总线故障定位及干扰排除呢? 目前,国内机动车保有量已经突破三亿大关。由于大量的燃油车带来严峻的环境问题,因此全面禁售燃油车的日程在…

ResNet-50算法

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、理论知识储备 1.CNN算法发展 AlexNet是2012年ImageNet竞赛中&#xff0c;由Alex Krizhevsky和Ilya Sutskever提出&#xff0c;在2012年ImageNet竞赛中&a…

防火墙双双机热备

设备直路部署&#xff0c;上下行连接交换机 如 图所示&#xff0c;DeviceA和DeviceB的业务接口都工作在三层&#xff0c;上下行分别连接二层交换机。上行交换机连接运营商的接入点&#xff0c;运营商为企业分配的IP地址为1.1.1.3和1.1.1.4。现在希望DeviceA和DeviceB以负载分担…

鸿蒙 雷达图 绘制 人生四运图

let radius = Math.min(this.context.width, this.context.height) / 2 - 20;let centerX = this.context.width / 2;let centerY = this.context.height / 2;// 绘制圆环this.context.strokeStyle = #E4E4E4;const numRings = 5;const ringInterval = 1;for (let i = 0; i <…

Zookeeper:基于Zookeeper的分布式锁

一、Zookeeper分布式锁原理 二、Zookeeper JavaAPI操作 1、Curator介绍 Curator是Apache Zookeeper的Java客户端。常见的Zookeeper Java API&#xff1a; 原生Java API。ZkClient。Curator。 Curator项目目标是简化Zookeeper客户端的使用。Curator最初是Netfix研发的&#xf…

C++学习笔记---串口通信

串口基础知识 DB9针的RS-232串口&#xff0c;分别是公头、母头&#xff0c;这两种串口可以连接在一起。DB9针的串口信号脚编号及信号脚的具体含义如下 串口通信可以使用3根线完成&#xff0c;对应信号脚分别是&#xff1a;2接收、3发送、5地线。对此&#xff0c;有个简单的记法…

你知道大数据信用分低需要如何改善吗?

在当今社会&#xff0c;大数据信用分已经成为个人信用评估的重要指标之一。然而&#xff0c;有时候我们会发现自己的大数据信用分较低&#xff0c;这可能会对我们的信用状况产生负面影响。那么&#xff0c;如何改善自己的大数据信用分呢?本文将从信用分低的原因进行分析&#…

python pyautogui.position实时输出坐标

import pyautogui import timewhile True:# 获取鼠标当前坐标x, y pyautogui.position()# 打印坐标print(f"当前坐标&#xff1a;({x}, {y})")# 暂停1秒time.sleep(1) 输出实时鼠标位置坐标

6.26.4.1 基于交叉视角变换的未配准医学图像多视角分析

1. 介绍 许多医学成像任务使用来自多个视图或模式的数据&#xff0c;但很难有效地将这些数据结合起来。虽然多模态图像通常可以在神经网络中作为多个输入通道进行配准和处理&#xff0c;但来自不同视图的图像可能难以正确配准(例如&#xff0c;[2])。因此&#xff0c;大多数多视…

【集成学习】基于python的stacking回归预测

1 回归模型 当涉及到线性回归、岭回归、套索回归、决策树回归、随机森林回归、梯度提升回归和支持向量机回归模型的原理时&#xff0c;我们可以按照以下方式清晰地解释它们&#xff1a; 1.1 线性回归 线性回归是利用数理统计中的回归分析来确定两种或两种以上变量间相互依赖的…