Статические переменные в функциях-членах - PullRequest
144 голосов
/ 03 июня 2011

Может кто-нибудь объяснить, как статические переменные в функциях-членах работают в C ++.

Учитывая следующий класс:

class A {
   void foo() {
      static int i;
      i++;
   }
}

Если я объявляю несколько экземпляров A, увеличивает ли вызов foo() в одном экземпляре статическую переменную i во всех экземплярах?Или только тот, к которому он был вызван?

Я предполагал, что у каждого экземпляра будет своя собственная копия i, но пошаговое выполнение некоторого кода, который я имею, указывает на иное.

Ответы [ 3 ]

151 голосов
/ 03 июня 2011

Поскольку class A - это не шаблонный класс, а A::foo() - это не шаблонная функция. Внутри программы будет только одна копия static int i.

Любой экземпляр объекта A будет влиять на тот же i, и время жизни i останется в программе. Чтобы добавить пример:

A o1, o2, o3;
o1.foo(); // i = 1
o2.foo(); // i = 2
o3.foo(); // i = 3
o1.foo(); // i = 4
124 голосов
/ 03 июня 2011

Ключевое слово static, к сожалению, имеет несколько разных не связанных значений в C ++

  1. При использовании для элементов данных это означает, что данные размещены в классе а не в случаях.

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

  3. При использовании на уровне модуля компиляции (модуля) это означает, что переменная похожа на глобальную (т.е. выделяетсяи инициализируется до запуска main и уничтожается после выхода main), но переменная не будет доступна или видима в других единицах компиляции .

IДобавлен акцент на той части, которая наиболее важна для каждого использования.Использование (3) несколько не рекомендуется в пользу безымянных пространств имен, которые также допускают неэкспортированные объявления классов.

В вашем коде ключевое слово static используется со значением номер 2 и не имеет ничего общего с классами.или экземпляры ... это переменная функции , и будет только одна ее копия.

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

#include <stdio.h>

template<int num>
void bar()
{
    static int baz;
    printf("bar<%i>::baz = %i\n", num, baz++);
}

int main()
{
    bar<1>(); // Output will be 0
    bar<2>(); // Output will be 0
    bar<3>(); // Output will be 0
    bar<1>(); // Output will be 1
    bar<2>(); // Output will be 1
    bar<3>(); // Output will be 1
    bar<1>(); // Output will be 2
    bar<2>(); // Output will be 2
    bar<3>(); // Output will be 2
    return 0;
}
0 голосов
/ 03 июня 2011

Упрощенный ответ:

Статические переменные, независимо от того, являются ли они членами (не шаблонной) class или (не шаблонной) функции, ведут себя - технически - как глобальная метка, область действия которойограничено class или функцией.

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