-1

在一个类中,如果我像下面这样声明一个析构函数和一个运算符,那么就会调用一个析构函数。例如

#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....

4

2 回答 2

2

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

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

更新:

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

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

这是三法则的经典例子。需要复制构造函数、赋值或析构函数的类通常需要这三个。如果你使用的是 C++11,它就变成了三、四或五的规则。

于 2013-02-19T20:57:22.210 回答
0
width=height=0;

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

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

您可以设置变量值,但在析构函数完成后,您无论如何都不应该使用它们,因此这个示例几乎没有实际用途。

于 2013-02-19T21:03:12.423 回答