На 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
...?