递增运算符重载
#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的引用呢
为什么要返回引用?
-
允许连续操作:
- 返回引用允许对同一个对象连续进行操作,例如
++myint1
,++myint1
,这样可以在单行代码中多次递增同一个对象,而不是每次操作都产生一个新的对象副本。
- 返回引用允许对同一个对象连续进行操作,例如
-
符合习惯:
- C++ 中的递增运算符通常都返回引用,这是语言设计的习惯和标准做法。例如,内置类型如
int
的递增运算符++
也返回一个引用。
- C++ 中的递增运算符通常都返回引用,这是语言设计的习惯和标准做法。例如,内置类型如
-
性能优化:
- 返回引用可以避免不必要的对象复制,提高了程序的性能。如果返回的是对象副本而不是引用,每次递增操作都会创建一个新的对象,这样会增加内存分配和拷贝构造函数的调用开销。
-
一致性和预期:
- 当其他程序员阅读你的代码时,他们会期望递增操作符的行为与内置类型类似,即修改并返回同一对象的引用。这种一致性有助于代码的可读性和维护性。
总结
因此,为了允许对象的连续递增操作、提高性能、符合语言习惯和预期,重载前置递增运算符 ++
应当返回对象类型的引用 MyInteger&
。这样做可以确保代码更加高效、清晰和符合 C++ 的编程习惯。
对于代码MyInteger operator++(int),为什么不用地址引用呢
在重载后置递增运算符 operator++(int)
的函数中,为什么不使用地址引用(即 MyInteger& operator++(int)
)而是使用对象值的方式(MyInteger operator++(int)
)呢?
后置递增运算符的定义
后置递增运算符 operator++(int)
需要接受一个额外的 int
类型的参数,通常用来区分前置递增运算符和后置递增运算符的重载版本。这个参数本身并不会被使用,它的唯一目的是为了在重载函数签名中与前置递增运算符 operator++()
区分开来。
返回类型选择
-
返回值类型:
MyInteger operator++(int)
返回的是一个MyInteger
类型的对象副本,而不是引用。这是因为后置递增运算符的语义要求返回的是递增前的原始值(即操作前的值),而不是递增后的值。- 如果使用
MyInteger& operator++(int)
返回引用的方式,那么在返回前需要先记录原始值,然后再递增对象的值。这会导致返回的引用指向的是递增后的值,与后置递增运算符的语义不符。
-
后置递增操作:
- 在后置递增运算符中,通常会先创建一个当前对象的副本(用于返回原始值),然后再对对象自身进行递增操作。这样可以确保返回的是递增前的值,同时也不影响后续的对象状态。
代码示例分析
在代码中,后置递增运算符 operator++(int)
的实现如下:
MyInteger operator++(int)
{
// 先记录当前值
MyInteger temp = *this;
// 后递增
m_Num++;
// 返回记录的值(递增前的值)
return temp;
}
这里,temp
是一个局部对象,它用来保存当前对象的值,在实现后置递增操作之后,返回这个保存的值。因此,这种方式是符合后置递增运算符的语义和期望的。
总结
因此,为了确保后置递增运算符的正确实现和语义,应当返回对象类型的副本而不是引用。这样可以保证返回的值是递增前的原始值,同时符合 C++ 中后置递增运算符的一般实现方式。