-1

In a class if i declare a destructor and a operator like below, then a destructor is called. For e.g.

#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;
}

Why does the destructor called when i am doing the operation +?? the final value of n is coming -1 after the program terminates....

4

2 に答える 2

2

デストラクタは、技術的にやりたいことができるという意味で、通常のvoid関数と同じです。これには、破棄されようとしている(無意味な)メンバー変数の変更が含まれます。通常、この関数を使用して、動的に割り当てられたメモリをクリーンアップしたり、オブジェクトが保持しているリソースを解放したりします。

オブジェクトがスコープ外になると、通常、デストラクタが呼び出されます。オブジェクトの幅と高さを0に強制すると、領域は0になりますが、とにかくそれを呼び出すことはできませarea()ん。もうなくなった。

アップデート:

より多くのコードを見ると、の最終的な値nが間違っている理由がわかります。コピーコンストラクターがありません。あなたがそれを提供しない場合、コンパイラはあなたのためにそれを生成します、そしてそれはインクリメントすることを知りませんn。あなたoperator+も正しく見えませんが(コピーアンドペーストエラー?)、どこかでコピーが行われていると思います。そうでないとコンパイルされません。これを追加してみてください:

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

これは三つのルールの典型的な例です。コピーコンストラクタ、代入、またはデストラクタを必要とするクラスには、通常、3つすべてが必要です。また、C ++ 11を使用している場合は、3、4、または5のルールになります。

于 2013-02-19T20:57:22.210 に答える
0
width=height=0;

これにより、widthとの値がheight0に設定されますが、デストラクタが実行された後は、オブジェクトを使用したり、その内部変数にアクセスしようとしたりする必要がないため、役に立ちません。おそらく、これらの変数を記述子の別の場所で使用できますが、何をしようとしているのかはわかりませんが、例に基づいています。なぜこれを試しているのか、解決したい「本当の」問題が何であるのかは明らかではありません。

後でこれらの値が必要になる場合は、デストラクタが設定するグローバルをいくつか用意してください。次に、各オブジェクトのデストラクタがグローバルを変更します。

変数値を設定することはできますが、デストラクタが完了した後は、とにかくそれらを使用するべきではないため、この例はほとんど実用的ではありません。

于 2013-02-19T21:03:12.423 に答える