我有以下代码:
class Array
{
public:
int aaa;
Array():aaa(1){}
void print()
{
cout << aaa << endl;
}
Array& operator++()
{
aaa++;
return *this;
}
Array operator++(int)
{
Array a(*this);
aaa++;
return a;
}
};
我有一些问题如下:
为什么前缀返回一个引用而后缀返回一个对象?在《C++ Primer》一书中,作者只解释了“
为了与内置运算符保持一致
”。然后,我测试了代码:
数组ar;
(ar++).print(); // print 1 ar.print(); // print 2
输出正是我所期望的。 现在我将重载后缀函数中的代码更改为:
Array operator++(int)
{
Array a(*this);
a.aaa++; // changed this
return a;
}
我调用了测试代码:
Array ar;
(ar++).print(); // this prints 2
ar.print(); // this prints 1
为什么我得到这样的结果?
最佳答案
后缀运算符返回一个对象,而不是引用,因为它必须返回当前对象的未更改 版本;它必须在增量完成之前返回值。因此必须分配一个新对象。如果您返回一个引用,它会是一个对什么的引用?
在您的第二个示例中,您正在创建一个新对象,递增它并返回它,但您没有更改应用运算符的原始对象——这显然是错误的,所以给出错误的结果。
关于c++ - 重载后缀运算符如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10442904/