揮発性のメモ2

http://d.hatena.ne.jp/iww/

コンストラクタ、デストラクタが呼ばれる順番

#include <iostream>
using namespace std;

class C {
public:
    C(){ cout << "C start" << endl; }
    virtual ~C(){ cout << "C end" << endl; }
};

class B {
public:
    B(){ cout << "B start" << endl; }
    virtual ~B(){ cout << "B end" << endl; }
};

class A {
public:
    B b;
    A(){ cout << "A start" << endl; }
    virtual ~A(){ cout << "A end" << endl; }
};

int main() {
    A a;
    C c;

    return 0;
}
B start
A start
C start
C end
A end
B end

Aはメンバー変数にBを持つ。このとき
コンストラクタはメンバー変数のほうが先に呼ばれる(コンストラクタの中で使えるし)
デストラクタはメンバー変数のほうが後で呼ばれる(デストラクタの中で使えるし)


同じ階層のメンバー変数は、コンストラクタは宣言順に、デストラクタは宣言と逆順に呼ばれる。 これは仕様で決まってる
C++の規格において、自動変数として使われたクラスのデストラク… - 人力検索はてな
コンストラクタとデストラクタ | Programming Place Plus C++編【言語解説】 第13章




C++のエッセンス ビャーネ・ストラウストラップ, Bjarne Stroustrup, 柴田 望洋