在重载预增量运算符时,是否必须返回对象的引用?

nam*_*123 8 c++ function operator-overloading

我可以用吗:

MyClass& MyClass::operator++ () {
    a++;  // private var of MyClass
    return (*this);
}
Run Code Online (Sandbox Code Playgroud)

或者它可以是:

MyClass MyClass::operator++ ();
Run Code Online (Sandbox Code Playgroud)

有什么不同?


谢谢你的回答.我有另一个问题.

很多人都这样做:

MyClass& MyClass::operator++();
MyClass MyClass::operator++(int);
Run Code Online (Sandbox Code Playgroud)

这不合逻辑吗?如果可以,请举一些例子.

我知道第一个版本是预增量,第二个版本是后增量,但我问为什么第一个版本返回引用而第二个版本没有?它在相同的代码(类)中,并且使用相同的代码.

Rob*_*obᵩ 16

不,你不具备的参考回到你的对象,当你超载预先递增运算符.事实上,你可能会返回任何你想,MyClass,int,void,等等.

这是一个设计问题 - 您必须问自己,您能够返回的班级用户最有用的是什么.

作为一般规则,类操作符在它们引起最少混淆时最有用,也就是说,当它们在基本类型上操作最像操作符时.在这种情况下,基本类型的预增量运算符:

int  i = 7;
j = ++i;
Run Code Online (Sandbox Code Playgroud)

递增变量,然后返回新值.如果这是您想要的唯一用途MyClass,那么返回您的课程副本就足够了.

但是,基本类型上的预增量运算符实际上返回左值.所以,这是合法的:

int i = 7;
int *p = &++i;
Run Code Online (Sandbox Code Playgroud)

如果要支持此类操作,则必须返回引用.

是否有特定原因导致您不想返回引用?对于您的特定课程,这不是一个格式良好的概念吗?如果是这样,请考虑返回void.在这种情况下,这个表达式++myObject是合法的,而事实myOtherObject = ++myObject并非如此.