首页 > 编程语言 >类和对象-C++运算符重载-递增运算符重载

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

时间:2024-07-06 22:58:52浏览次数:19  
标签:MyInteger ++ 递增 C++ 运算符 operator int 重载

递增运算符重载

#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++ 中后置递增运算符的一般实现方式。

标签:MyInteger,++,递增,C++,运算符,operator,int,重载
From: https://blog.csdn.net/weixin_61839295/article/details/140237271

相关文章

  • 力扣第7题:整数反转 字符串函数综合运用(C++)
    给你一个32位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围 [−231, 231 −1] ,就返回0。假设环境不允许存储64位整数(有符号或无符号)。示例1:输入:x=123输出:321示例2:输入:x=-123输出:-321示例3:......
  • 力扣第22题:括号生成 深度优先搜索(DFS)和它的优化(C++)
    数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]思路递出去,再归回来,是为递归。DFS算法是利用递归思想的一种搜索算法。想象一个矿井,从地面到井底有多层......
  • 力扣第6题:Z字形变换 交替V和Λ规律法(C++)
    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。......
  • 【C++干货基地】C++模板深度解析:进阶技巧与高级特性掌握(按需实例化、全特化与偏特化)文
    ......
  • c++所有头文件.h
    代码:(包括c++12的非标准头文件)#ifndef_EW_H_#define_EW_H_#include<tchar.h>#include<synchapi.h>#include<algorithm>#include<bitset>#include<cctype>#include<cerrno>#include<clocale>#include<cmath>#inc......
  • windows下C++配置googletest过程记录
    文章目录下载googletest将googletest解压到项目目录并创建build文件夹编译googletest在项目的CMakeLists.txt文件中添加相关依赖编写测试并执行参考下载googletestReleasev1.14.0·google/googletest·GitHub将googletest解压到项目目录并创建build文件夹在g......
  • C++初学者指南-4.诊断---用gdb调试
    C++初学者指南-4.诊断—用gdb调试幻灯片gdb/前端gdbGNU的命令行调试器cgdb基于终端的gdb前端Linux安装:sudoapt-getinstallcgdbgdbgui基于浏览器的gdb前端网址:https://gdbgui.com/安装:sudopipinstallgdbguiQtCreator可以连接gdbVisualStudioCode可以连接gdbV......
  • C++初学者指南-3.自定义类型(第一部分)-异常
    C++初学者指南-3.自定义类型(第一部分)-异常文章目录C++初学者指南-3.自定义类型(第一部分)-异常简介什么是异常?第一个示例用途:报告违反规则的行为异常的替代方案标准库异常处理问题和保证资源泄露使用RAII避免内存泄漏!析构函数:不要让异常逃脱!异常保证无抛出异常保......
  • 运算符
    运算符(operator)算术运算符+、-、*、/(考虑小数可转换为double)、%(取余,模运算)、++(自增)、--(自减)+:不同类型相加,只要有long类型,总和为long类型,否则都是int类型。publicstaticvoidmain(String[]args){longa=123123123123123L;intb=123;shortc=1......
  • C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例
    C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例目录C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例1、概述2、实现效果3、主要代码4、源码地址更多精彩内容......