日期类运算符重载以及const成员详细解析

个人主页:点我进入主页

专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶    算法

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂

目录

一.前言

二.运算符重载

2.1概念

2.2比较的符号重载

2.2.1 operator ==

2.2.2其余的符号重载

2.3+-类实现

2.3.1operator+和operator+=的比较

2.3.2其余的符号重载

2.4前置++后置++

2.5重载<<和>>

2.6类的代码

三.const成员

四.总结


一.前言

        我们在前面写了关于类的实现,这时候有人问到怎末实现类里边元素的运算呢?比如日期类我们怎末实现日期类的基本运算呢?我们知道类的成员变量是不能在类的外边进行访问的,我们就选算是想进行变量的运算也不能实现,那我们应该如何实现呢?我们可以封装成函数来实现,祖师爷对这进行了修改出现了我们的operator。那是如何实现的呢?

二.运算符重载

2.1概念

        C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)。

  • 不能通过连接其他符号来创建新的操作符:比如operator@
  • 重载操作符必须有一个类类型参数
  • 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  • 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
  • .* :: sizeof ?: . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

我们的类的代码为:

class Data {
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;
	}
private:
	int _year;
	int _month;
	int _day;

};

我们的运算符重载函数函数名放在public中,我们采用声明和定义分离的形式大致的形式,最后实现的类的代码我会在左后给出。 

2.2比较的符号重载

2.2.1 operator ==

在这里我给出一个样例,后面的和这个相同,我会直接给出全部的代码,我们的代码为:

bool Data::operator==(const Data& d)
{

	return _year == d._year &&
		_month == d._month &&
		_day == d._day;

}

这个代码是判断两个是否相同,我们运行的代码为:

	Data d1(2014, 2, 5);
	Data d2(d1);
	d2.operator==(d1);
	d2 == d1;

其中第一种是用d2的函数的形式,在设计这一块时祖师爷还支持了我们直接用==。当我们运行到这一步时会自动跳转到我们定义的函数的位置。

2.2.2其余的符号重载

bool Data::operator <(const Data& d)
{
	if (_year < d._year) 
		return true;
	else if (_year > d._year) 
		return false;
	else
	{
		if (_month < d._month)
			return true;
		else if (_month > d._month)
			return false;
		else
		{
			if (_day < d._day)
				return true;
			else 
				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);
}
bool Data::operator !=(const Data& d)
{
	return !(*this == d);
}

看到后面是不是感觉很爽,使用的方法和上面的相同都是有两种。

2.3+-类实现

2.3.1operator+和operator+=的比较

        在写代码之前我们需要知道+和+=的含义,+返回一个天数,自身不改变,+=是让本身改变,这时候我们有两种写法一种是先写+在写+=,另一种是先写+=再写+,两种方案我会一一给出,然后进行比较。

先写+再写+=代码如下:

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

先写+=再写+代码如下:

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

 我们对比+,第一种用了一个临时变量,第二个用了一个临时变量,+=时左边没有用临时变量,右边用了一个,我们知道调用临时变量我们还需要调用拷贝构造,所以我们选用先写+=再写+。我们针对返回值进行解说,我们知道+应该符合连续的+比如1+2+3,所以我们的日期类应该也满足我们的连续+,1+2+3的底层是先计算2+3得到的值为一个临时变量,临时变量在和1加得到临时变量为结果,所以我们需要返回我们的Data类型,我们知道传参不如传引用快,但是由于我们返回的是一个临时变量不能传引用,因为函数结束内存释放,所以我们只能返回值(这个值会村早寄存器)。我们看+=,由于+=会改变我们的值,且返回的是我们的Data类型,所以我们采用Data&来返回引用。

2.3.2其余的符号重载

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

	}
	return *this;
}

2.4前置++后置++

        我们的前置++和后置++符号都是++,我们的operator的规则是在opertaor的后面加上我们要重载的符号,由于我们的前置++后置++符号一样,所以祖师爷采用将后置++的参数部分加上一个int和前置++构成函数重载。前置--和后置--与前置++和后置++操作一样,这里不做具体解释。我们直接上代码:

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

2.5重载<<和>>

既然支持符号重载那我们的<<和>>也应该支持,我们直接上代码:

ostream& Data::operator<< (ostream& out)
{
	out << _year << "/" << _month << "/" << _day;
	return out;
}
istream& Data::operator>>(istream& in)
{
	in >> _year >> _month >> _day;
	return in;
}

当我们写在类里面时我们想用时需要写成

	d2 << cout;
	d2 >> cin;

这个和我们的写法相仿,我们需要用其他的形式才行,这需要我们的友元操作,下一篇文章我会给大家进行讲解。

2.6类的代码

class Data {
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);

	int GetMonthDay(int year, int month);
	Data operator+(int day);
	Data& operator+=(int day);
	Data operator-(int day);
	Data& operator-=(int day);

	Data& operator++();
	Data& operator++(int);

	ostream& operator<< (ostream& out);
	istream& operator>>(istream& in);

private:
	int _year;
	int _month;
	int _day;

};

三.const成员

当我们在类里面写一个print函数时我们时写成:

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

但是这是对权限的一种扩大,我们这个函数应该满足不能修改我们的值,但是这个函数却可以修改我们的值,这个时候我们出现了我们的const,应该如何写呢?我们看代码,在声明时写成:

void Print() const;

定义写为:

void Data::Print() const
{
	cout << _year << "/" << _month << "/" << _day;
}

四.总结

今天的内容就结束了,主要就是对运算符的重载的详细解析,可以多体会体会其中的含义,最后希望大家可以一键三连。

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

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

相关文章

linux 安装docker

目录 环境 操作步骤 1 下载脚本 2 执行脚本 3 检查docker版本&#xff0c;证明安装成功 环境 阿里云 ubuntu 22.04 64位 操作步骤 参考linux系统安装docker-腾讯云开发者社区-腾讯云 (tencent.com) 1 下载脚本 curl -fsSL https://get.docker.com -o get-docker.sh …

JavaWeb学习|Filter与ThreadLocal

学习材料声明 所有知识点都来自互联网&#xff0c;进行总结和梳理&#xff0c;侵权必删。 引用来源&#xff1a;尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 Filter 1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是&#xff1a;Servlet 程序、Liste…

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之XCP模块配置详解(上)

XCP模块配置详解 - 上 一、XCP模块配置项处理1.1 Tx Pdu配置项二、XCP模块其他配置项2.1 参数XcpMainFunctionPeriod2.2 参数XcpOnCanEnabled2.3 容器XcpOnCan总结从本节开始先专注与配置项错误处理以及构建Autosar Rh850的最小系统搭建。 XCP模块在汽车电子各控制器中处于十分…

使用ShardingJDBC实现分库分表

一、测试环境 JDK&#xff1a;1.8SpringBoot&#xff1a;2.7.17MySQL驱动&#xff1a;5.1.49MyBatis&#xff1a;2.3.1shardingJDBC&#xff1a;5.1.0 二、核心依赖 <!-- mysql 驱动 --> <dependency><groupId>mysql</groupId><artifactId>mysq…

Django学习笔记教程全解析:初步学习Django模型,初识API,以及Django的后台管理系统(Django全解析,保姆级教程)

把时间用在思考上是最能节省时间的事情。——[美]卡曾斯 导言 写在前面 本文部分内容引用的是Django官方文档&#xff0c;对官方文档进行了解读和理解&#xff0c;对官方文档的部分注释内容进行了翻译&#xff0c;以方便大家的阅读和理解。 概述 在上一篇文章里&#xff0…

【Python】高级数据类型

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

8.JS中的== 操作符的强制类型转换规则

对于 来说&#xff0c;如果对比双方的类型不一样&#xff0c;就会进行类型转换。假如对比 x 和 y 是否相同&#xff0c;就会进行如下判断流程&#xff1a; 首先会判断两者类型是否相同&#xff0c;类型相同的话就比较两者的大小&#xff1b;类型不相同的话&#xff0c;就会进…

Compose低级别API动画指南

Google官方为Compose提供的动画API与原生View体系的动画API相差甚远&#xff0c;目前总共分为四类&#xff1a;高级别动画API、低级别动画API、自定义动画、手势和动画&#xff08;其他&#xff09;&#xff0c;下图是官方提供的流程指示图&#xff0c;以供根据不同使用场景来选…

PMDG 737

在Simbrief中生成计划后下载两个文件 放到A:\Xbox\Community\pmdg-aircraft-738\Config\Flightplans中

深度学习疆界:探索基本原理与算法,揭秘应用力量,展望未来发展与智能交互的新纪元

目录 什么是深度学习 深度学习的基本原理和算法 深度学习的应用实例 深度学习的挑战和未来发展方向 挑战 未来发展方向 深度学习与机器学习的关系 深度学习与人类的智能交互 什么是深度学习 深度学习是一种基于神经网络的机器学习方法&#xff0c;旨在模仿人类大脑分析…

LabVIEW虚拟测试与分析仪

LabVIEW虚拟测试与分析仪 在现代工程技术领域&#xff0c;虚拟仪器的开发和应用已成为一种趋势。利用LabVIEW软件平台开发的虚拟测试与分析仪器进行展开&#xff0c;实现工程测试和分析中的实际需求。通过结合LabVIEW的强大功能和灵活性&#xff0c;成功实现了一套高效、精确的…

各指针含义区分

一、char *a P109: (1)(变量)指针变量&#xff1a;指针变量&#xff0c;即指针的定义&#xff1a;用来存放指针的变量。指向的是变量&#xff0c;且可以改变其指向的地址。P104 char *a (2)(变量)指针常量&#xff1a;指针常量&#xff0c;指向的是变量首字节的地址&#xff…

算法基础——单调栈,单调队列

目录 1.单调栈 例题&#xff1a;【模板】单调栈 例题:求和 2.单调队列 例题&#xff1a;滑动窗口 1.单调栈 例题&#xff1a;【模板】单调栈 可以想象出一个柱状图&#xff0c;值越大&#xff0c;这个柱子越高 以此题的样例为例&#xff1a; 第一个数为7&#xff0c;想…

【Java程序员面试专栏 分布式中间件】ElasticSearch 核心面试指引

关于ElasticSearch 部分的核心知识进行一网打尽,包括ElasticSearch 的基本概念,基本架构,工作流程,存储机制等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 基础概念 从数据分类入手,考察全文索引的基本概念 现实世界中数据有哪…

yolov5配置教程

yolov5 yolov5 notepad notepad 直接下一步就可以 Git Git 取消勾选 修改默认编辑器为npp 其他都直接下一步 python3.8.1 python3.8.1 主要勾选添加环境变量 其他下一步即可 Miniconda Miniconda 其他下一步 然后添加系统环境变量 Pycharm Pycharm 把这个界面所…

MPLAB V8.92 printf

Compile error “A heap is required, but has not been specified” Set printf function #if 0 //for UART1 int fputc(int ch, FILE *f) { IFS1bits.U2TXIF 0; // if (runConfig.printOn 1) { // usart_data_transmit(USART0, (uint8_t)ch); U2TXREG ch; // while (RESE…

linux(阿里云)安装pytorch

目录 环境 安装步骤 1 检查python3和pip3是否已经安装 2 安装pytorch 3 安装完毕&#xff0c;检查pytorch版本 环境 阿里云 ubuntu 22.04 UEFI版 64位 安装步骤 1 检查python3和pip3是否已经安装 输入下面两条指令&#xff1a; python3 --version pip --version 检…

Nvm安装(windows版)

1、nvm 是什么 &#xff08;1&#xff09;nvm(Node.js version manager) 是一个命令行应用&#xff0c;可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 &#xff08;2&#xff09;有时候&#xff0c;我们可能同时在进行多个项目开发&#xff0c;而多个项…

书生·浦语大模型第六课作业

面向GPU的环境安装 conda create --name opencompass --clone/root/share/conda_envs/internlm-base source activate opencompass git clone https://github.com/open-compass/opencompass cd opencompass pip install -e . 数据准备 # 解压评测数据集到 data/ 处 cp /shar…

神经网络 | CNN 与 RNN——深度学习主力军

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要将卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;这两个深度学习主力军进行对比。我们知道&#xff0c;从应用方面上来看&#xff0c;CNN 用于图像识别较多&#xff0c;而 RNN 用于…
最新文章