重载前缀和后缀运算符的类对象的指针

时间:2017-04-25 13:47:19

标签: c++ operator-overloading

我在类中重载了前缀和后缀增量/减量运算符。

#include <iostream>
using namespace std;

class X
{
public:
X() { cout << "X" << endl;}
~X() { cout << "~X" << endl; }

X& operator++() { X *x = new X; return *x; }
X operator++(int) { X *x = new X; return *x; }
X& operator--() { X *x = new X; return *x; }
X operator--(int) { X *x = new X; return *x; }
};

int main()
{
X p;
cout << endl;
++p;
cout << endl;
p++;
cout << endl;
return 0;
}

输出是:

X

X

X
~X

~X

似乎在使用postfix增量时,对象被实例化并删除,但是当使用前缀增量时,它不会被删除。

这种行为的原因是什么?

2 个答案:

答案 0 :(得分:2)

您的postfix运算符按值返回,因此复制了使用new创建的对象,并且由于您没有将其绑定到任何内容,因此{{1}中的后缀表达式末尾的副本将被销毁}。通过复制构造函数输出您可以观察到此行为的内容,请参阅示例here

另一方面,前缀运算符只是返回对您使用main分配的对象的引用,因此在new中表达式的末尾只是引用被销毁。

在这两种情况下,您都会泄漏由main分配的内存。

答案 1 :(得分:1)

postfix版本返回X的实例,而不是对实例的引用,因此调用此副本的析构函数。无论如何,您不必在运算符中使用new

X& operator++() { return *this; }
X operator++(int) { X x; return x; }