类和对象-C++运算符重载-递增运算符重载

递增运算符重载

#include<bits/stdc++.h>
using namespace std;
//重载递增运算符//自定义整型
class MyInteger
{friend ostream & operator<<(ostream & cout,MyInteger myint);
public:MyInteger(){m_Num = 0;}//重载前置++运算符MyInteger& operator++(){//先进行++运算m_Num++;//再将自身做返回return *this; } //重载后置++运算符//void operator++(int) int代表占位参数,可以用于区分前置和后置递增MyInteger operator++(int){//先记录当时的结果MyInteger temp = *this; //后递增m_Num++;//最后将记录结果返回return temp;} 
private:int m_Num;
};
//重载左移运算符
ostream & operator<<(ostream & cout,MyInteger myint)
{cout<<myint.m_Num;return cout;	
} 
void test01()
{MyInteger myint;cout<<++myint<<endl;
}
void test02()
{MyInteger myint;cout<<myint++<<endl;
}
int main(){test01();test02();return 0;
}

对于代码MyInteger& operator++(),为什么要返回MyInteger的引用呢

为什么要返回引用?

  1. 允许连续操作

    • 返回引用允许对同一个对象连续进行操作,例如 ++myint1++myint1,这样可以在单行代码中多次递增同一个对象,而不是每次操作都产生一个新的对象副本。
  2. 符合习惯

    • C++ 中的递增运算符通常都返回引用,这是语言设计的习惯和标准做法。例如,内置类型如 int 的递增运算符 ++ 也返回一个引用。
  3. 性能优化

    • 返回引用可以避免不必要的对象复制,提高了程序的性能。如果返回的是对象副本而不是引用,每次递增操作都会创建一个新的对象,这样会增加内存分配和拷贝构造函数的调用开销。
  4. 一致性和预期

    • 当其他程序员阅读你的代码时,他们会期望递增操作符的行为与内置类型类似,即修改并返回同一对象的引用。这种一致性有助于代码的可读性和维护性。

总结

因此,为了允许对象的连续递增操作、提高性能、符合语言习惯和预期,重载前置递增运算符 ++ 应当返回对象类型的引用 MyInteger&。这样做可以确保代码更加高效、清晰和符合 C++ 的编程习惯。

对于代码MyInteger operator++(int),为什么不用地址引用呢

在重载后置递增运算符 operator++(int) 的函数中,为什么不使用地址引用(即 MyInteger& operator++(int))而是使用对象值的方式(MyInteger operator++(int))呢?

后置递增运算符的定义

后置递增运算符 operator++(int) 需要接受一个额外的 int 类型的参数,通常用来区分前置递增运算符和后置递增运算符的重载版本。这个参数本身并不会被使用,它的唯一目的是为了在重载函数签名中与前置递增运算符 operator++() 区分开来。

返回类型选择

  1. 返回值类型

    • MyInteger operator++(int) 返回的是一个 MyInteger 类型的对象副本,而不是引用。这是因为后置递增运算符的语义要求返回的是递增前的原始值(即操作前的值),而不是递增后的值。
    • 如果使用 MyInteger& operator++(int) 返回引用的方式,那么在返回前需要先记录原始值,然后再递增对象的值。这会导致返回的引用指向的是递增后的值,与后置递增运算符的语义不符。
  2. 后置递增操作

    • 在后置递增运算符中,通常会先创建一个当前对象的副本(用于返回原始值),然后再对对象自身进行递增操作。这样可以确保返回的是递增前的值,同时也不影响后续的对象状态。

代码示例分析

在代码中,后置递增运算符 operator++(int) 的实现如下:

MyInteger operator++(int)
{// 先记录当前值MyInteger temp = *this; // 后递增m_Num++;// 返回记录的值(递增前的值)return temp;
}

这里,temp 是一个局部对象,它用来保存当前对象的值,在实现后置递增操作之后,返回这个保存的值。因此,这种方式是符合后置递增运算符的语义和期望的。

总结

因此,为了确保后置递增运算符的正确实现和语义,应当返回对象类型的副本而不是引用。这样可以保证返回的值是递增前的原始值,同时符合 C++ 中后置递增运算符的一般实现方式。

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

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

相关文章

隐藏的h1写法(以图换字)

所谓以图换字&#xff0c;即直接使用一张图片或背景&#xff0c;没有文字。我们知道&#xff0c;蜘蛛爬取时是不会获取图片上的内容的&#xff0c;但是如果是添加上文字&#xff0c;即便使用一些字体&#xff0c;也可能达不到图片的显示效果。如何将用户体验与SEO优化相兼容呢&…

Linux CentOs7系统scl镜像源失效问题

1. 问题描述 成功使用下面命令安装scl源后 [rootiZwz946ibli8ikuyqgtc58Z ~]# yum install centos-release-scl-rh尝试使用scl安装redis5&#xff0c;报了下面错误&#xff1a; [rootiZwz946ibli8ikuyqgtc58Z ~]# yum install rh-redis5-redis Loaded plugins: fastestmirro…

移动硬盘“需格式化”危机:应对策略与数据拯救指南

移动硬盘困境&#xff1a;突如其来的“格式化”提示 在日常的数据存储与传输过程中&#xff0c;移动硬盘作为便携且容量可观的存储媒介&#xff0c;深受用户青睐。然而&#xff0c;当这块存储“小能手”突然弹出“需要格式化”的警告时&#xff0c;无疑给用户的数据安全敲响了…

软考中级数据库系统工程师备考经验分享

前几天软考成绩出了&#xff0c;赶紧查询了一下发现自己顺利通过啦&#xff08;上午63&#xff0c;下午67&#xff0c;开心&#xff09;&#xff0c;因此本文记录一下我的备考经验分享给大家。因为工作中项目管理类的知识没有系统学习过&#xff0c;本来想直接报名软考高级证书…

Unity3D 场景树与组件化开发详解

Unity3D是一款功能强大的游戏开发引擎&#xff0c;其独特的场景树和组件化开发模式为开发者提供了高效、灵活的游戏开发体验。本文将详细解析Unity3D中的场景树与组件化开发模式&#xff0c;并给出相应的技术详解和代码实现。 对惹&#xff0c;这里有一个游戏开发交流小组&…

Symfony框架深度解析:构建高效PHP应用的强大基石

引言 在PHP的广阔生态系统中&#xff0c;Symfony框架以其强大的功能、灵活的架构和丰富的社区资源&#xff0c;成为了构建复杂且高性能Web应用的首选之一。自2005年诞生以来&#xff0c;Symfony不断演进&#xff0c;为开发者提供了一套完整且易于扩展的工具集&#xff0c;旨在…

【IO】文件操作

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 文件1.1 认识文件1.2 分清操作的是内存还是硬盘1.3 路径1.3.1 目录结构1.3.2 相对和绝对路径 1.4 文本文件…

速盾:防护攻击CDN

随着互联网的快速发展&#xff0c;网络安全问题也日益突出。其中&#xff0c;DDoS&#xff08;分布式拒绝服务攻击&#xff09;是一种常见的网络安全威胁&#xff0c;能够对目标服务器造成严重影响&#xff0c;使其无法正常运行。为了应对这种威胁&#xff0c;许多企业和组织开…

WIN32核心编程 - 内存管理 内存页面

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 VirtualAlloc - VirtualFree VirtualAllocEx - VirtualFreeEx VirtualLock(Ex) - VirtualUnlock(Ex) VirtualQuery(Ex) Process Memory Information VirtualProtect(Ex) Heap - GetProce…

大数据Spark 面经

1: Spark 整体架构 Spark 是新一代的大数据处理引擎&#xff0c;支持批处理和流处理&#xff0c;也还支持各种机器学习和图计算&#xff0c;它就是一个Master-worker 架构&#xff0c;所以整个的架构就如下所示&#xff1a; 2: Spark 任务提交命令 一般我们使用shell 命令提…

Flutter-实现双向PK进度条

如何实现一个双向PK进度条 在Flutter应用中&#xff0c;进度条是一个非常常见的组件。而双向PK进度条则能够展示两个对立的数值&#xff0c;如对战中的双方得分对比等。本文将介绍如何实现一个具有双向PK效果的进度条&#xff0c;并支持竖直和斜角两种过渡效果。 1. 需求 我…

FMEA在大型光伏电站安全生产管理中的应用

一、FMEA概述 FMEA&#xff08;Failure Modes and Effects Analysis&#xff09;即失效模式和影响分析&#xff0c;是一种用于识别和分析产品或过程中潜在故障模式及其影响的方法。它通过对产品或过程中可能出现的故障模式进行系统性地梳理和分析&#xff0c;评估其可能的影响…

配置Nginx来代理多个Docker微服务组成统一的后台服务

配置Nginx来代理多个Docker微服务组成统一的后台服务可以通过以下步骤完成&#xff1a; 假设情境和准备工作 假设你有多个 Docker 容器&#xff0c;每个容器运行一个微服务&#xff0c;例如&#xff1a; 微服务1: 可以通过 http://localhost:8001 访问微服务2: 可以通过 htt…

并查集[讲课留档]

并查集&#xff08;DSU&#xff09; 一些可以实现合并和 查询的 集合。 简洁优雅的树型数据结构&#xff0c;主要用于解决一些元素分组的问题。可以管理一系列不相交的集合&#xff0c;并支持两种操作&#xff1a; 合并&#xff08;join&#xff09;&#xff1a;把两个不相交…

通过SDK使用百度智能云的图像生成模型SDXL

登录进入百度智能云控制台&#xff0c;在模型广场按照图像生成类别进行筛选&#xff0c;可以找到Stable-Diffusion-XL模型。点击Stable-Diffusion-XL模型的API文档后在弹出的新页面下拉可以找到SDK调用的说明。 import qianfandef sdxl(file: str, prompt: str, steps: int 2…

MySQL——PreparedStatement对象

PreparedStatement可以防止SQL注入&#xff0c;效率更高。 1. 增 public class TestInsert {public static void main(String[] args) throws SQLException {Connection conn null;PreparedStatement ps null;ResultSet rs null;try {conn jdbcUtils.getConnection();// …

矩阵分析与应用1-矩阵代数基础

矩阵分析与应用1-矩阵代数基础 1 矩阵的基本运算2 矩阵的初等变换3 向量空间、线性映射与Hilbert空间4 内积与范数5 随机向量6 矩阵的性能指标7 逆矩阵与伪逆矩阵8 Moore-Penrose逆矩阵9 矩阵的直和与Hadamard积10 Kronecker积与Khatri-Rao积11 向量化与矩阵化12 稀疏表示与压缩…

金丝键合强度测试仪试验条件要求:键合拉脱/引线拉力/剪切力等

金丝键合强度测试仪是测量引线键合强度&#xff0c;评估键合强度分布或测定键合强度是否符合有关的订购文件的要求。键合强度试验机可应用于采用低温焊、热压焊、超声焊或有关技术键合的、具有内引线的器件封装内部的引线-芯片键合、引线-基板键合或内引线一封装引线键合&#…

华为机试HJ23删除字符串中出现次数最少的字符

华为机试HJ23删除字符串中出现次数最少的字符 题目&#xff1a; 实现删除字符串中出现次数最少的字符&#xff0c;若出现次数最少的字符有多个&#xff0c;则把出现次数最少的字符都删除。输出删除这些单词后的字符串&#xff0c;字符串中其它字符保持原来的顺序。 想法&…

第三方商城对接重构(HF202407)

文章目录 项目背景一、模块范围二、问题方案1. 商品模块整体来说这块对接的不是太顺利&#xff0c;梳理了几条大概的思路&#xff1a; 2. 订单模块3. 售后4. 发票5. 结算单 经验总结 项目背景 作为供应商入围第三方商城成功&#xff0c;然后运营了一段时间&#xff0c;第三方通…