статическая переменная в функции-члене - PullRequest
4 голосов
/ 12 февраля 2011
bool SomeClass::Function( bool thankYou = true )
{

    static bool justAbool = false;
    // Do something with justAbool;
    ...
}

Я искал вокруг, но не могу найти ничего об этом, кроме глобальных переменных или функций-членов.

Что делает вышеизложенное, т.е. что происходит, сохраняет ли justAbool свое значениепосле выхода из сферы?Или он «запоминает» значение при повторном входе в область?

Ответы [ 6 ]

22 голосов
/ 04 декабря 2014

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

13 голосов
/ 12 февраля 2011

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

justAbool будет инициализирован (используя прилагаемый инициализатор = false) при первом запуске функции.называется.После этого он сохранит свое предыдущее значение и не будет повторно инициализирован при повторном вызове функции.

Ниже приведены некоторые более подробные сведения о продолжительности и сроке хранения со ссылками на стандарт.

Еслиобъект имеет статическая продолжительность хранения , это означает, что хранение объекта продолжается в течение всей программы (от начала до конца).(3.7.1 [basic.stc.static])

Поскольку bool является типом без нетривиального конструктора, его время жизни отражает его время хранения, то есть он живет от начала до концапрограммы.(3.8 [basic.life])

Все объекты с статической продолжительностью хранения (включая локальные объекты) инициализируются нулями перед любой другой инициализацией.(6.7 / 4 [stmt.decl]) [Для локальных объектов с инициализатором это довольно академично, потому что нет возможности прочитать их значение до того, как их объявление достигнуто.]

Локальные объекты типа POD с статическая длительность хранения , инициализированная константами-выражениями , инициализируется до ввода их блока, в противном случае локальные объекты с статической длительностью хранения инициализируются, когда управление проходит через их объявление.(Снова 6.7 / 4)

Реализация разрешает, но не требуется, для выполнения ранней инициализации в некоторых ситуациях.

1 голос
/ 12 февраля 2011

Вышеуказанная функция делает то же, что и в комментарии // Do something with justAbool;.

Если серьезно, да, переменная static (в данном случае justAbool) внутри функции сохраняет это значение даже после возврата из функции. Инициализируется ТОЛЬКО ОДИН РАЗ. И каждый последующий вызов использует его так, как будто это глобальная переменная. Срок его службы равен концу программы.

int f()
{
   static int v = 0;
   return ++v;
}
int main()
{
   cout << f() << endl;
   cout << f() << endl;
   cout << f() << endl;
   cout << f() << endl;
}

Выход:

1
2
3
4

Онлайн-демонстрация: http://www.ideone.com/rvgB5

0 голосов
/ 22 июля 2015

статическая локальная переменная уровня функции, инициализация зависит от типов переменных:

  • POD: инициализируется перед main ()
  • non-POD: инициализируется в первый раз, строка вфункция выполнена.
0 голосов
/ 12 февраля 2011

justAbool сохраняет свое значение после выхода из области видимости. Что еще вы хотели, чтобы этот код делал в точности?

0 голосов
/ 12 февраля 2011

justAbool на самом деле является обычной статической переменной - она ​​существует с самого начала программы и инициализируется только один раз.Особенность в том, что она известна только в этой функции - если вы попытаетесь использовать ее вне функции, компилятор не будет знать, что это такое.

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