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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值