1

特定のクラスで作成されたオブジェクトの数を追跡しようとしています。クラスで演算子 ++ をオーバーロードすると、デストラクタが呼び出されますが、理由がわかりません。もう少し詳しく言うと:

class num{
public:
    virtual void setValue(int)=0;
    static int db;
    num(){}
    ~num(){}
};

int num::db = 0;

class int32: public num{
public:
    // GET
    int getValue();

    // SET
    void setValue(int f);

    // constructor
    int32()
    {
        cout << "Construction..."<<endl;
        this->value = 0;num::db++;
    }

    // destructor
    ~int32()
    {
        cout << "destruction..."<<endl;
        num::db--;
    }

    // operators
    int32 operator++(int);
    int32 operator++(void);

protected:
    int value;
};

int32 int32::operator ++()
{
    this->value++;
    return *this;
}

int32 int32::operator ++(int)
{
    this->value++;
    return *this;
}

int main()
{
    int32 i;
    i.setValue(20);

    cout << (i++).getValue()<<endl;
    cout << (++i).getValue()<<endl;

    cout << num::db;

    cout << endl << "End of execution.";
    return 1;
}

結果は次のとおりです: 構築... 21 破壊... 22 破壊... -1 実行の終了.破壊...

++i と i++ の後にデストラクタが呼び出されますが、なぜでしょうか?

どうもありがとう!

4

3 に答える 3

3

コピーを返すからです。コピーコンストラクターを作成する必要があります。

于 2013-02-18T10:24:33.147 に答える
1

++演算子でオブジェクトのコピーを返しています。

呼び出すreturn *thisたびに、呼び出し元のコードに渡されるオブジェクトのコピーを実際に作成します。

于 2013-02-18T10:24:48.623 に答える
0

これは、「operator++()」メソッドが両方とも「int32」のコピーを返すためです。したがって、呼び出しごとに新しいインスタンスが作成されて返されます。

于 2013-02-18T10:25:22.357 に答える