类析构函数

Class Destructor

本文关键字:析构函数      更新时间:2023-10-16

在一个类中,如果我声明了一个析构函数和一个如下所示的运算符,那么就会调用析构函数。例如

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

从技术上讲,析构函数就像一个普通的void函数,可以随心所欲。这包括修改即将被销毁的成员变量(毫无意义)。通常,您使用此函数来清理动态分配的内存或释放对象所拥有的资源。

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

更新:

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

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

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

width=height=0;

这将widthheight的值设置为0,但在析构函数完成后就没有用了,因为您不应该再使用该对象,也不应该试图访问其内部变量。也许你可以在destructor的其他地方使用这些变量,但我不确定你想做什么,但基于这个例子。不清楚你为什么要尝试这个,也不清楚你想解决的"真正"问题是什么

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

你可以设置变量值,但在析构函数完成后,你无论如何都不应该使用它们,所以这个例子没有什么实际用处。