Ключевое слово static
, к сожалению, имеет несколько разных не связанных значений в C ++
При использовании для элементов данных это означает, что данные размещены в классе а не в случаях.
При использовании для данных внутри функции это означает, что данные распределяются статически, инициализируется при первом вводе блока и продолжается допрограмма выходит.Также переменная видна только внутри функции.Эта особенность локальной статики часто используется для реализации отложенного конструирования синглетонов.
При использовании на уровне модуля компиляции (модуля) это означает, что переменная похожа на глобальную (т.е. выделяетсяи инициализируется до запуска 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;
}