重複の可能性:
C++でのオブジェクトの破棄
2つのクラスがあり、1つはと呼ばれArray
、もう1つはと呼ばれるとしMessageOnExit
ます。
Array
クラスに。という静的データメンバーがあると仮定しcounter
ます。
クラスは次のとおりです。
class Array {
public:
static int counter;
Array(){counter++;}
~Array(){counter--;}
};
class MessageOnExit {
public:
~MessageOnExit(){cout << Array::counter;}
};
以下は、これらのクラスを使用する「メイン」です。
// static variable definition
int Array::counter;
// global object definition
MessageOnExit message;
void main() {
Array a1, a2;
Array a3(a1);
}
最初の2つの宣言は2に変更counter
され、Empty / Defaultコンストラクターが2回呼び出されます。3番目の宣言はcounter
、Defaultコピーコンストラクターが呼び出されるため、変更されません。
これで、main
実行が完了すると、静的メンバーの値がcounter
デストラクタ-1
呼び出しに続き(a1、a2、およびa3が破棄された後)、次にmessage
デストラクタが呼び出され、この値(-1
)が出力されます。
私の質問は、デストラクタが呼び出されているときに静的メンバーcounter
がまだ生きていて利用可能であることをどのように知るかです。message
また、静的/グローバルオブジェクト/変数の定義順序を変更した場合、つまり、のmessage
前に定義されcounter
た場合、値は残り-1
ます。
要約すると、どのような変更を行っても、プログラムがメッセージデストラクタの成功を終了して静的メンバーにアクセスするcounter
と、その理由がわかりません。グローバルオブジェクトが最初に定義されているかどうかを理解している限り、message
そのデストラクタは最後に呼び出されるため、counter
そのデストラクタに値を使用することはできません。
前もって感謝します!男