1

このプレゼンテーションを見て、スライド 379 に次のコードを示します (いくつかの小さな変更があります)。

#include <iostream>
using namespace std;

struct A
{
    A() { cout << "A()" << endl; }
    A(int v) { cout << "A(int)" << endl; }
    ~A() { cout << "~A()" << endl; }
};

struct X
{
    X(int v) { a = v; }
    X(long v) : a(v) {}
    A a;
};

int main()
{
    cout << "bad style:" << endl;
    { X slow(int(2)); }
    cout << "good style:" << endl;
    { X fast(long(2)); }
}

出力は次のとおりです。

bad style:
A()
A(int)
~A()
~A()
good style:
A(int)
~A()

(このコードは私のマシンで実行され、g++ でコンパイルされました)

これで、悪いスタイルでコンストラクタが 2 回呼び出される理由がわかりましたが、デストラクタはなぜそうするのでしょうか。

4

4 に答える 4

8
X(int v) { a = v; }
//         ^^^^^

下線部は課題です。( )operator=を取るものはありませんが、 からへの暗黙の変換があります。したがって、型の一時オブジェクトが構築され、コンパイラが生成した代入演算子に渡されます。後で破棄され (完全な式が終了して作成された後)、予期しない 2 番目のデストラクタがあります。intvintAA

于 2013-10-26T18:16:58.467 に答える
1

ロジックは

Instantiate a Class    ... +1 [Constuctor]
Desinstantiate a Class ... -1 [Destructor]

オブジェクトがスコープ外に渡されるか、明示的に削除されると、クラス オブジェクトに対してデストラクタが呼び出されます。

したがって、クラスのデストラクタは、これらのクラスが作成された回数と同じ回数呼び出されることが期待できます。

于 2013-10-26T18:17:11.090 に答える
1

あなたは「暗黙の型キャスト」の犠牲になりました。コンストラクターに「明示的」を追加してみると、コードの何が問題なのかがわかります (以前の暗黙的な変換の場所でコンパイルが停止します)。

struct A
{
    explicit A() { cout << "A()" << endl; }
    explicit A(int v) { cout << "A(int)" << endl; }
    ~A() { cout << "~A()" << endl; }
};

ここに説明があります: http://en.cppreference.com/w/cpp/language/implicit_cast

于 2013-10-26T19:04:56.577 に答える