【Cpp】运算符重载 | 前置++(--)# 后置++(--)

标题:【Cpp】运算符重载 | 前置++(--)# 后置++(--)

@水墨不写bug



正文开始:

        对于内置类型的前置后置++(--)我们已经很清楚了:

        前置++(--)先++(--)再使用,后置++(--)先使用再++(--);

特别的:

        对于指针类型,++(--)表示向前或者向后跳过这个指针指向的一个数据类型,例如对于int型,表示向前或者向后跳过sizeof(int)字节的地址,其他的指针类型类似。

 

        本文主要内容是对自定义类型的前置后置自增自减运算的讨论,实现方式和相关语法规则。 

        编译器对于内置类型的自增自减运算已经有明确的定义,但是对于对象(自定义类型),它的自增自减运算没有明确的定义,它的定义取决于你的(自定义类型)对象的具体使用场景是什么,以及你想 使 对象 通过自增自减来达到什么样的功能。

举一个例子:

        比如你实现的对象是一个日期的类,日期的自增自减操作就是日期的向前向后推移;

        再比如说你实现了一个学籍系统,你的对象是一个学生的类,那么学生的自增自减看似没有什么实际意义,但是你可以赋予它意义,通过定义运算符重载函数,学生的自增自减也许就是学生的学号的向前向后推移。


         本文以日期类的运算符重载为例子,讨论自增自减运算符的重载的实现。

这里直接给出日期类的头文件:


class Date
{
public:friend ostream& operator<<(ostream& out, const Date d);// 获取某年某月的天数inline int GetMonthDay(int year, int month){assert(month >= 1 && month <= 12);static int _month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//如果进入if说明是闰年并且是二月if (month == 2 && ( (year % 4 == 0) && (year % 100 != 0) ) || (year % 400 == 0)){return 29;}elsereturn _month[month];}// 全缺省的构造函数//声明时写缺省值Date(int year = 1900, int month = 1, int day = 1);// 拷贝构造函数// d2(d1)Date(const Date& d);// 赋值运算符重载// d2 = d3 -> d2.operator=(&d2, d3)Date& operator=(const Date& d);// 析构函数~Date();// 日期+=天数Date& operator+=(int day);// 日期+天数Date operator+(int day);// 日期-天数Date operator-(int day);// 日期-=天数Date& operator-=(int day);// 前置++Date& operator++();// 后置++Date operator++(int);// 后置--Date operator--(int);// 前置--Date& operator--();// >运算符重载bool operator>(const Date& d);// ==运算符重载bool operator==(const Date& d);// >=运算符重载bool operator >= (const Date& d);// <运算符重载bool operator < (const Date& d);// <=运算符重载bool operator <= (const Date& d);// !=运算符重载bool operator != (const Date& d);// 日期-日期 返回天数int operator-(const Date& d);
private:int _year;int _month;int _day;
};

(一)前置++(--)

        对前置++(--)运算符进行重载时,根据运算符重载规则:

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

        对日期的自增就是日期天数加一,向后推移一天。

Date& Date::operator++()
{*this += 1;return *this;
}// 前置--
//
Date& Date::operator--()
{*this -= 1;return *this;
}

(二)后置++(--)

        对于后置++(--)的重载就遇到问题了:

        前置重载已经把名字给占用了,后置不就会因为函数重名,并且不满足重载规则而无法重载吗?

        为了解决这一问题,Cpp规定,对于后置自增自减运算符,在参数列表中加一个整形参数作为标记,这样由于满足了Cpp的函数重载规则,于是后置自增自减运算符就可以重载了。


//先使用再++
// 后置++
Date Date::operator++(int)
{Date tem = *this;*this += 1;return tem;
}// 后置--
Date Date::operator--(int)
{Date tem;*this -= 1;return tem;
}

        为了满足后置这一“功能”,在具体实现时,拷贝构造一个tem对象,作为操作符返回值,返回上一级函数使用,也就是说,上一级函数实际使用的不是this对象自增自减后的值,而是拷贝构造的tem对象的值。

(三)总结

         对于自定义类型的自增自减重载,本来函数是重名的,逻辑上无法构成重载(函数名称相同,参数列表完全一致)。但是为了构成重载,Cpp规定:

        1.前置自增自减按原方法写;

        2.后置自增自减在参数列表中加一个整形变量以示区分。


完~

未经作者同意禁止转载 

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

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

相关文章

数字化校园的发展阶段

现代化技能虽然能很大程度上给人们日子带来很大的便利&#xff0c;可是许多新兴的科技被人们所接纳需求一个按部就班的进程。数字化学校也是如此。把高新科技引入到学校中&#xff0c;完全推翻之前的教育形式&#xff0c;关于学校来说也是一个巨大的挑战。所以数字化学校也不可…

【北京迅为】《iTOP-3588开发板快速烧写手册》-第4章 烧写器RKDevTool常用功能

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

scikit-learn多因子线性回归预测房价

1.首先是单因子线性回归预测房价 import numpy as np import pandas as pd from matplotlib import pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score# 1.读取csa房屋数据 path D:/pythonDATA/us…

自动化测试:Selenium入门指南!

Selenium是一个强大的自动化测试工具&#xff0c;特别适用于Web应用测试。本指南将介绍Selenium的安装、常用功能以及一些常见方法&#xff0c;帮助入门并能够更灵活地进行自动化测试。Selenium是一个用于自动化浏览器操作的工具&#xff0c;它广泛应用于Web应用程序的测试和网…

NETBIOS和DNS

Netbios NETBIOS只能工作在局域网。 NetBIOS&#xff08;Network Basic Input/Output System, 网络基本输入输出系统&#xff09;是一种接入服务网络的接口标准。主机系统通过WINS服务、广播及lmhosts文件多种模式&#xff0c;把NetBIOS名解析对应的IP地址&#xff0c;实现信…

SQL 基础 | JOIN 操作介绍

在SQL中&#xff0c;JOIN是一种强大的功能&#xff0c;用于将两个或多个表中的行结合起来&#xff0c;基于相关的列之间的关系。 JOIN操作通常用在SELECT语句中&#xff0c;以便从多个表中检索数据。 以下是几种基本的JOIN类型以及它们的用法&#xff1a; INNER JOIN&#xff1…

工业镜头助力锂电制造业精准检测

在电动汽车、电动轻型车、电动工具、消费电子和新型储能等行业大发展的背景下&#xff0c;锂电池综合优势与下游领域对电池大容量、高功率、使用寿命和环境保护日益提升的需求相契合&#xff0c;存在广阔的市场应用前景。受益于动力、消费和储能三大细分领域的快速发展&#xf…

使用ROW_NUMBER()分组遇到的坑

1、再一次清洗数据时&#xff0c;需要过滤重复数据&#xff0c;使用了ROW_NUMBER() 来分组给每组数据排序号 在获取每组的第一行数据 with records as(select cc.F_Id as Id,REPLACE(cc.F_CNKITitle,char(10),1) as F_CNKITitle,REPLACE(REPLACE(cc.F_Special,专题&#xff1…

web安全day03

MYSQL注入&#xff1a; SQL 注入的原理、危害及防御措施 SQL 注入的原理&#xff1a;原本的 SQL 语句在与用户可控的参数经过了如拼接、替换等字符串操作后&#xff0c;得到一个新的 SQL 语句并被数据库解析执行&#xff0c;从而达到非预期的效果。 SQL 注入的危害&#xff…

大数据时代,如何准确查询并解读大数据信用报告?

在互联网时代&#xff0c;个人信息的安全和隐私保护愈发受到人们的关注。随着大数据技术的不断发展&#xff0c;越来越多的人开始关心自己的大数据报告。那么&#xff0c;如何找一个靠谱的地方查询个人大数据报告呢?本文将为您详细解答。 一、先了解大数据报告的含义 首先&…

时钟模块RX8025SA 内置32.768 kHz石英晶体振荡器

实时时钟模块RX8025SA&#xff0c;料号Q41802552000100&#xff0c;是一款低功耗&#xff0c;高精度时钟芯片。时钟芯片RX8025SA选型过程中应该注意哪些&#xff1f;RX8025SA又应用在哪些领域呢&#xff1f;爱普生RTC实时时钟RX8025SA&#xff0c;内置32.768 kHz石英晶体振荡器…

2024年5月12日(星期天)骑行海囗

2024年5月12日 (星期天&#xff09;骑行海口&#xff0c;早8:30到9:00大观公园门口集合&#xff0c;9:30准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:大观公园门口集合 &#xff0c;家住东&#xff0c;西&#xff0c;南&#xff0c;北…

嵌入式Linux开发如何查看应用所链接的动态库

在开发中我们常常需要查看一个应用究竟链接了哪些对应的动态库 桌面linux的使用方法不赘述&#xff0c;网上资料有很多&#xff0c;对于嵌入式linux开发中&#xff0c;我们在ubuntu中使用ldd 是不行的 应该使用

MT3031 AK IOI

思路&#xff1a;把每个节点存到堆&#xff08;大根堆&#xff09;里。 如果节点放入后总时间没有超过m则放入堆中&#xff1b;如果总时间超过了&#xff0c;就看堆头元素是否比新元素大。如果大&#xff0c;则删除堆头&#xff08;反悔贪心&#xff09;。 注意别忘记开long l…

分布式事务Seata使用

我们要学习seata&#xff0c;首先需要具备如下技术储备&#xff1a; 数据库事务的基本知识&#xff1b;maven工具的使用&#xff1b;熟悉SpringCloudAlibaba技术栈&#xff1b;掌握SpringDataJPA简单使用&#xff1b; 一. Seata基本概念 1.seata是什么 Seata是阿里巴巴中间…

解决“您的连接不是私密连接”

目录 那么为什么会出现这样提示呢 https访问有什么不同 将http访问更改为https访问 当您在浏览网页时&#xff0c;遇到“您的连接不是私密连接”的提示&#xff0c;这通常表示浏览器认为您的连接不够安全。这是因为浏览器无法信任网站使用的SSL证书&#xff0c;或者网站没有…

Linux下的SPI通信

SPI通信 一. 1.SPI简介: SPI 是一种高速,全双工,同步串行总线。 SPI 有主从俩种模式通常由一个主设备和一个或者多个从设备组从。SPI不支持多主机。 SPI通信至少需要四根线,分别是 MISO(主设备数据输入,从设备输出),MOSI (主设数据输出从设备输入),SCLK(时钟信号),CS/SS…

【声明ACL权限】

声明ACL权限 当应用在申请权限来访问必要的资源时&#xff0c;发现部分权限的等级比应用APL等级高&#xff0c;开发者可以选择通过ACL方式来解决等级不匹配的问题。 举例说明&#xff0c;如果应用需要使用全局悬浮窗&#xff0c;需要申请 ohos.permission.SYSTEM_FLOAT_WINDO…

这么受欢迎的Transform到底解决了什么问题?

文章目录 这么受欢迎的Transform到底解决了什么问题&#xff1f;背景基于卷积神经网络&#xff08;CNN&#xff09;基于注意力机制的神经网络大语言模型ChatGPT总结参考 这么受欢迎的Transform到底解决了什么问题&#xff1f; 背景 在过去的十几年中&#xff0c;深度卷积神经…

MT3032 环形喂猪

思路&#xff1a; 1.输出Error的情况&#xff1a;m>n/2 2.首先将饥饿值放到大根堆中&#xff0c;先喂最饿的猪i&#xff0c;则把i的饥饿值加到sum中&#xff1b;但也又可能喂i-1和i1&#xff0c;所以此时需要反悔&#xff1a;把i取出来的同时&#xff0c;将a[i-1]a[i1]-a…