К static
сожалению, это ключевое слово имеет несколько разных значений в C ++.
При использовании для элементов данных это означает, что данные размещаются в классе, а не в экземплярах.
При использовании для данных внутри функции это означает, что данные распределяются статически, инициализируются при первом вводе блока и сохраняются до завершения программы. Также переменная видна только внутри функции. Эта особенность локальной статики часто используется для реализации ленивых конструкций синглетонов.
При использовании на уровне модуля компиляции (модуля) это означает, что переменная похожа на глобальную (то есть размещена и инициализирована до main
запуска и уничтожена после main
выхода), но переменная не будет доступна или видима в других модулях компиляции .
Я добавил акцент на части, которая наиболее важна для каждого использования. Использование (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;
}
static int i
специфичной для данного экземпляра, например,o1.foo(); // i = 1
и$o2.foo(); // i = 1
...?