类析构函数
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;
这将width
和height
的值设置为0,但在析构函数完成后就没有用了,因为您不应该再使用该对象,也不应该试图访问其内部变量。也许你可以在destructor的其他地方使用这些变量,但我不确定你想做什么,但基于这个例子。不清楚你为什么要尝试这个,也不清楚你想解决的"真正"问题是什么
如果您稍后需要这些值,请使用析构函数设置的一些全局值。然后每个对象的析构函数都会改变全局。
你可以设置变量值,但在析构函数完成后,你无论如何都不应该使用它们,所以这个例子没有什么实际用处。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 不命名构造函数和析构函数上的类型错误