static
Infelizmente, a palavra-chave tem alguns significados diferentes não relacionados em C ++
Quando usado para membros de dados, significa que os dados são alocados na classe e não nas instâncias.
Quando usado para dados dentro de uma função, significa que os dados são alocados estaticamente, inicializados na primeira vez em que o bloco é inserido e perduram até o encerramento do programa. Além disso, a variável é visível apenas dentro da função. Esse recurso especial da estática local é frequentemente usado para implementar a construção lenta de singletons.
Quando usada no nível da unidade de compilação (módulo), significa que a variável é como uma global (ou seja, alocada e inicializada antes de main
ser executada e destruída após as main
saídas), mas que a variável não estará acessível ou visível em outras unidades de compilação .
Eu adicionei alguma ênfase na parte que é mais importante para cada uso. Use (3) é um pouco desencorajado em favor de namespaces não nomeados, que também permitem declarações de classe não exportadas.
No seu código, a static
palavra-chave é usada com o significado número 2 e não tem nada a ver com classes ou instâncias ... é uma variável da função e haverá apenas uma cópia dela.
Como corretamente iammilind disse, no entanto, poderia haver várias instâncias dessa variável se a função fosse uma função de modelo (porque nesse caso, de fato, a própria função pode estar presente em muitas cópias diferentes do programa). Mesmo nesse caso, é claro que as classes e instâncias são irrelevantes ... veja o seguinte exemplo:
#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
específico da instância, de modo que, por exemplo,o1.foo(); // i = 1
e$o2.foo(); // i = 1
...?