日期类运算符重载以及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.mzph.cn/news/683098.shtml

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

相关文章

ZBX_NOTSUPPORTED: Unsupported item key. 原因排查

进行自定义监控项时&#xff0c;在zabbix-agent端测试没问题&#xff0c;却在zabbix-server进行测试时&#xff0c;出现 ZBX_NOTSUPPORTED: Unsupported item key. 1.在zabbix-agent测试没问题&#xff0c;证明自定义监控项的脚本没问题&#xff0c;却在zabbix-server端测试出…

点击侧边栏菜单时只切换 <router-view> 中的内容,而不是进行整个页面的路由跳转(动态路由)

解决方法&#xff1a;在 <el-menu> 的 select 事件中调用了 handleMenuSelect 方法来处理菜单项的选择。你可以在 handleMenuSelect 方法中根据菜单项的 index 来执行相应的操作&#xff0c;例如更新组件内的数据或者切换组件。由于整个页面的路由路径并没有改变&#xf…

平时积累的FPGA知识点(7)

平时在FPGA群聊等积累的FPGA知识点&#xff0c;第七期&#xff1a; 11 描述扇出的xilinx官方文档是&#xff1f; 解释&#xff1a;ug949 12 在BD中如何指定某个IP用global&#xff0c;其他的用OOC模式&#xff1f;因为某个模块引用的IP带着XPM&#xff0c;综合不了 解释&am…

代码随想录Day50 | 70. 爬楼梯 322. 零钱兑换 279.完全平方数

代码随想录Day50 | 70. 爬楼梯 322. 零钱兑换 279.完全平方数 70.爬楼梯322.零钱兑换279.完全平方数 70.爬楼梯 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 状态 dp数组 dp[j]表示爬上第j阶台阶需要的方法数递推公式&#xff0c;由于在每一阶台阶可以向上走1~m阶&a…

代码随想录算法训练营Day57|647. 回文子串、516.最长回文子序列、动态规划总结

目录 647. 回文子串 前言 思路 算法实现 516.最长回文子序列 前言 思路 算法实现 动态规划总结 动规五部曲回顾 动规各小专题问题 647. 回文子串 题目链接 文章链接 前言 本题利用动态规划求解时&#xff0c;dp数组的定义与前面的就有些不同了&#xff0c;是难点之…

随机过程及应用学习笔记(三)几种重要的随机过程

介绍独立过程和独立增量过程。重点介绍两种独立增量过程-—维纳过程和泊松过程。 目录 前言 一、独立过程和独立增量过程 1、独立过程&#xff08;Independent Process&#xff09; 2、独立增量过程&#xff08;Independent Increment Process&#xff09; 二、正态过程&am…

debug - 打补丁 - 浮点数加法

文章目录 debug - 打补丁 - 浮点数加法概述笔记demo用CE查看汇编(x64debug)main()update_info()快捷键 - CE中查看代码时的导航打补丁的时机 - 浮点数加法补丁代码补丁效果浮点数寄存器组的保存END debug - 打补丁 - 浮点数加法 概述 在cm中, UI上显示的数值仅仅用来显示, 改…

力扣---通配符匹配

题目描述&#xff1a; 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。 * 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09;。 判定匹配成功的充要条件是&#xff…

华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接

文章目录 前言思路主要思路关于f函数的剖析Code就到这&#xff0c;铁子们下期见&#xff01;&#xff01;&#xff01;&#xff01; 前言 铁子们好啊&#xff01;今天阿辉又给大家来更新新一道好题&#xff0c;下面链接是23年9月27的华为笔试原题&#xff0c;LeetCode上面的ha…

开源≠不赚钱,开源软件盈利的7大模式。

开源不是目的&#xff0c;目的是圈用户&#xff0c;留住用户&#xff0c;盈利自然不成问题。 开源系统可以通过多种方式赚钱&#xff0c;以下是其中几种常见的方式&#xff1a; 提供付费支持&#xff1a; 开源系统可以提供付费的技术支持服务&#xff0c;包括安装、配置、维…

mysql5.6安装---windows版本

安装包下载 链接&#xff1a;https://pan.baidu.com/s/1L4ONMw-40HhAeWrE6kluXQ 提取码&#xff1a;977q 安装视频 1.解压完成之后将其放到你喜欢的地址当中去&#xff0c;这里我默认放在了D盘&#xff0c;这是我的根目录 2.配置环境变量 我的电脑->属性->高级->环境…

阿里云增加数据库访问白名单

阿里云增加数据库访问白名单 概况 我们希望在外网访问数据库时&#xff0c;可能会遇到无法连接的问题&#xff0c;这有可能是被拦截了。这时就需要去查看自己的ip有没有在白名单里面&#xff0c;没有的话就把ip加入到白名单。 路径 阿里云控制台-搜索RDS-进入RDS管理控制台…

宋小黑的生财知识资料库第1011期

大家好&#xff0c;我是小黑&#xff0c;在当前经济和职场环境中&#xff0c;拥有一份副业已经成为很多人增加财务安全感和提升个人能力的重要手段。通过投身于副业&#xff0c;你不仅可以为自己创造一个额外的收入来源&#xff0c;减少对主职工作的经济依赖&#xff0c;还可以…

【C++】类和对象(四)

前言&#xff1a;在类和对象中&#xff0c;我们走过了十分漫长的道路&#xff0c;今天我们将进一步学习类和对象&#xff0c;类和对象这块荆棘地很长&#xff0c;各位一起加油呀。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&a…

【Spring】定义过滤器Filter和拦截器Interceptor

# 定义过滤器 package com.holen.filter;import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import java.io.IOException;pub…

【Web】NSSCTF Round#18 Basic个人wp(部分)

目录 ①门酱想玩什么呢&#xff1f; ②Becomeroot ①门酱想玩什么呢&#xff1f; 先试一下随便给个链接 不能访问远程链接&#xff0c;结合评论区功能&#xff0c;不难联想到xss&#xff0c;只要给个评论区链接让门酱访问就可 我们研究下评论区 从评论区知道&#xff0c;要…

jmeter-问题三:如何在给接口命名,使得察看结果树更清晰

问题三&#xff1a;如何在给接口命名&#xff0c;使得察看结果树更清晰 jmeter中声明的变量在任意地方都可以引用&#xff0c;我们可以利用这一点来实现 解决方法&#xff1a; 场景&#xff1a;测试登录接口&#xff08;包含登录成功&#xff0c;密码错误&#xff0c;用户名…

Android---Jetpack Compose学习004

CompositionLocal 通常情况下&#xff0c;在 Compose 中&#xff0c;数据以参数形式向下流经整个界面树传递给每个可组合函数。但是&#xff0c;对于广泛使用的常用数据&#xff08;如颜色或类型样式&#xff09;&#xff0c;这可能会很麻烦。 为了支持无需将颜色作为显式参数…

- 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》

本文属于专栏《构建工业级QPS百万级服务》​​​​​ 1、前置知识 c的内存管理&#xff0c;主要说的是堆内存管理。现代计算机系统中&#xff0c;用户进程的堆内存&#xff0c;由内核映射。 堆内存的来源 主要是通过mmap()函数&#xff0c;在进程的虚拟地址空…

VueCLI核心知识综合案例TodoList

目录 1 拿到一个功能模块首先需要拆分组件&#xff1a; 2 使用组件实现静态页面的效果 3 分析数据保存在哪个组件 4 实现添加数据 5 实现复选框勾选 6 实现数据的删除 7 实现底部组件中数据的统计 8 实现勾选全部的小复选框来实现大复选框的勾选 9 实现勾选大复选框来…