在类中,如果我声明析构函数和下面的运算符,则调用析构函数。 例如,
#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。
答案 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;
这会将width
和height
的值设置为0,但在析构函数完成后无效,因为您不应再使用该对象,或尝试访问其内部变量。也许您可以在析构函数中的其他位置使用这些变量,但我不确定您要尝试做什么但基于示例。你尝试这个或你想解决的“真实”问题是什么并不明显。
如果稍后需要这些值,请使用析构函数设置的全局变量。然后每个对象的析构函数将改变全局变量。
你可以设置变量值,但是在析构函数完成后你不应该使用它们,所以这个例子几乎没用。