2011-07-22 10 views
2

今日は本当に陰気なバグの原因を発見しました。これは、すべて安全に修正されますが、私は次のコードを実行したときに理由を理解したいと思います:関数スコープの静的変数がオブジェクトインスタンス間で持続するのはなぜですか?

using namespace System; 

ref class EvilClass 
{ 
public: 
    EvilClass() 
    { 

    } 

    void Print() 
    { 
     static bool enablePrint = false; 
     if(enablePrint) 
     { 
      Console::WriteLine("PrintEnabled"); 
     } 
     else 
     { 
      Console::WriteLine("PrintDisabled"); 
     } 
     enablePrint = true; 
    } 

}; 


int main(array<System::String ^> ^args) 
{ 
    Console::WriteLine(L"Hello World"); 

    EvilClass^ ec = gcnew EvilClass(); 

    ec->Print(); 
    ec->Print(); 

    delete ec; 
    ec = nullptr; 

    ec = gcnew EvilClass(); 

    ec->Print(); 
    ec->Print(); 

    delete ec; 
    ec = nullptr; 

    return 0; 
} 

を...私は、次を得る:

Hello World 
PrintDisabled 
PrintEnabled 
PrintEnabled 
PrintEnabled 

私は常に静的なことを想定していましたクラスの同じインスタンスへの呼び出しの間だけ持続するでしょうか?

答えて

2

"a static member variable has the same value in any instance of the class and doesn't even require an instance of the class to exist"

それによって、静的変数は、関数呼び出しとクラスのインスタンス間で持続します定義そのものです。通常の変数とは異なり、静的変数のデータは呼び出し間で保持され、一度しか初期化されません。

グローバルとスタティックの違いは、グローバルはどこでも使用でき、スタティックは初期化されたスコープ内でのみ使用できることです。どちらもプログラムの長さにとどまります。

http://en.wikipedia.org/wiki/Static_variable

http://c.ittoolbox.com/documents/difference-between-static-global-variable-12174

関連する問題