2016-09-08 18 views
3

私はこの単純なコードを書いて、私は別の結果を期待していました。静的割り当てのコンストラクタとデストラクタの順序

struct Test { 
    int value_; 
    Test(): value_(0) { 
    std::cout << "Constructor: "<< value_ << "\n"; 
    } 

    Test(int value): value_(value) { 
    std::cout << "Constructor: "<< value_ << "\n"; 
    } 

    ~Test() { 
    std::cout << "Destructor: "<< value_ << "\n"; 
    } 
}; 

int main(int argc, char **argv) { 
    Test t; 
    t = Test(10); 
    t = Test(15); 
    t = Test(20); 
    t = Test(25); 
} 

そして結果:

Constructor: 0 
Constructor: 10 
Destructor: 10 
Constructor: 15 
Destructor: 15 
Constructor: 20 
Destructor: 20 
Constructor: 25 
Destructor: 25 
Destructor: 25 

それは最後の行が繰り返される期待していなかったので、私は驚きました。なぜDestructor: 0が呼び出されなかったのですか?

+4

コンストラクタとデストラクタを印刷するときは、コピー/移動コンストラクタとコピー/移動代入演算子を飾る必要があります。 – NathanOliver

答えて

5

最初の「デストラクタ:25」は、Test(25)によって作成された一時オブジェクトの破棄に由来します。 2番目はコピーされたtの破壊からです。

最後の "Destructor:"行と最初の "Constructor:"以外のすべての出力は、それらの一時オブジェクトの作成と破棄に由来します。値0の一時オブジェクトを決して作成しないので、tが破棄されるまで、その値はもはや0ではないので、「デストラクタ:0」はありません。

+0

行 'Test t;'は値0の一時オブジェクトを作成します。 –

+0

@GlennTeitelbaumいいえ、それはありません。 't'は一時的なものではありません。 – NathanOliver

+0

それは面白いと私はフレーズとして '一時的なオブジェクト'を読んでいない、ちょうど 'tは永遠に終わらないと思った。 –

1

これらの行の最初は、一時オブジェクト。

これらの行の2番目は、tの破壊に対応します。あなたはmainの最後の行として

t = Test(25); 

を使用するので

tが破壊され

、その value_25です。

関連する問題