2017-04-25 69 views
0

我在类中重载了前缀和后缀增加/减少运算符。指向过载前缀和后缀运算符的类对象

#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 

看来,使用后缀增量时,对象被实例化和删除的,但使用前缀时,增加它没有被删除。

这种行为的原因是什么?

+2

你为什么在这里使用'new'? –

回答

2

您的Postfix运算符按值返回,因此您创建的对象new已被复制,并且由于您未将它绑定到任何内容,因此main中的后缀表达式末尾处的副本被破坏。通过也可以通过复制构造函数输出一些东西来观察这种行为,例如参见here

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

在这两种情况下,您正在泄漏由new分配的内存。

1

后缀版本返回X的实例,而不是对实例的引用,因此调用此副本的析构函数。无论如何,你不应该在你的运营商中使用new

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