类析构函数

时间:2013-02-19 20:52:31

标签: c++ class destructor

在类中,如果我声明析构函数和下面的运算符,则调用析构函数。 例如,

#include <iostream>
using namespace std;

class CRectangle {
    int width, height;
  public:
    static int n;
    CRectangle (int,int);
    ~CRectangle ();
    int area () {return (width * height);}
    CRectangle operator + (CRectangle);
};
CRectangle CRectangle::operator+ (CRectangle param){
    x+=param.x;
    y+=param.y;
}
CRectangle::CRectangle (int a, int b) {
  width = a;
  height = b;
  n++;
}

CRectangle::~CRectangle () {
    n--;
}
CRectangle::n=0;
int main () {
  CRectangle rect (3,4), rectb (5,6);
  cout << "rect area: " << rect.area() << endl;
  cout << "rectb area: " << rectb.area() << endl;
  rect=rect+rectb;
  return 0;
}

为什么析构函数在我执行操作时调用+ ?? 程序终止后,n的最终值为-1。

2 个答案:

答案 0 :(得分:2)

析构函数就像一个普通的void函数,从某种意义上说,你可以在技术上做任何你想做的事情。这包括修改即将销毁的成员变量(毫无意义)。通常,您使用此函数来清理动态分配的内存或释放对象持有的资源。

当对象超出范围时,通常会为您调用析构函数。将对象的宽度和高度强制为0将使区域为0,但无论如何您都无法在其上调用area()。它已经消失了。

<强>更新

看到更多代码后,我就会明白为什么n的最终值是错误的。你错过了一个拷贝构造函数。如果您不提供,编译器会为您生成一个,并且它不知道增加n。您的operator+看起来也不正确(复制并粘贴错误?),但我只能假设某些地方正在进行某些复制,否则就无法编译。尝试添加:

CRectangle::CRectangle(const CRectangle &rhs) : width(rhs.width), height(rhs.height)
{
    ++n;
}

这是Rule of Three的典型示例。需要复制构造函数,赋值或析构函数的类通常需要全部三个。如果您使用的是C ++ 11,它将成为Three, Four, or Five的规则。

答案 1 :(得分:0)

width=height=0;

这会将widthheight的值设置为0,但在析构函数完成后无效,因为您不应再使用该对象,或尝试访问其内部变量。也许您可以在析构函数中的其他位置使用这些变量,但我不确定您要尝试做什么但基于示例。你尝试这个或你想解决的“真实”问题是什么并不明显。

如果稍后需要这些值,请使用析构函数设置的全局变量。然后每个对象的析构函数将改变全局变量。

你可以设置变量值,但是在析构函数完成后你不应该使用它们,所以这个例子几乎没用。