Почему моя статическая переменная в области функций сохраняется между экземплярами объекта? - PullRequest
2 голосов
/ 22 июля 2011

Сегодня я обнаружил источник действительно коварной ошибки.Сейчас все безопасно исправлено, но я хотел бы понять, почему, когда я выполняю следующий код:

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 ]

4 голосов
/ 22 июля 2011

Ваше предположение неверно. Статическая переменная в функциональной области очень похожа на глобальную переменную. Существует только один глобальный пример этого. Подробнее здесь: Каково время жизни статической переменной в функции C ++?

2 голосов
/ 22 июля 2011

"статическая переменная-член имеет одинаковое значение в любом экземпляре класса и даже не требует наличия экземпляра класса" *

По определению статическаяПеременная будет сохраняться между вызовами функций и экземплярами классов.В отличие от обычных переменных, данные статической переменной сохраняются между вызовами и инициализируются только один раз.

Разница между глобальным и статическим состоит в том, что глобальный доступен везде, в то время как статический доступен только внутри области, в которой он был инициализирован.Оба сохраняются на протяжении всей программы.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...