Alguém pode explicar como variáveis estáticas em funções membro funcionam em C ++.
Dada a seguinte classe:
class A {
void foo() {
static int i;
i++;
}
}
Se eu declarar várias instâncias de A
, a chamada foo()
em uma instância incrementa a variável estática i
em todas as instâncias? Ou apenas aquele em que foi chamado?
Eu assumi que cada instância teria sua própria cópia i
, mas percorrer algum código que parece indicar de outra forma.
static int i
específico da instância, de modo que, por exemplo,o1.foo(); // i = 1
e$o2.foo(); // i = 1
...?m_
para indicar o status de i.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 asmain
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:
fonte
keyword static unfortunately has a few different unrelated meanings in C++
:) #Variáveis estáticas dentro de funções
A variável estática é criada dentro de uma função armazenada na memória estática do programa e não na pilha.
A inicialização da variável estática será feita na primeira chamada da função.
A variável estática reterá o valor em várias chamadas de função
A vida útil da variável estática é Program
Exemplos
Resultado :
Variável estática
Valor variável: 0
Valor variável: 1
Valor variável: 2
Valor variável: 3
Valor variável: 4
Variável automática
Valor variável: 0
Valor variável: 0
Valor variável: 0
Valor variável: 0
Valor variável: 0
fonte
Resposta simplificada:
As variáveis estáticas, independentemente de serem membros de uma função (sem modelo)
class
ou (sem modelo), comportam-se - tecnicamente - como um rótulo global cujo escopo é limitado àclass
função ou.fonte
MyClass& instance(){ static MyClass x("config.ini"); return x; }
- uma implementação portátil válida para uso de thread único exatamente porque as estatísticas locais NÃO são simplesmente como uma global, apesar do que você diz.