La palabra clave static
desafortunadamente tiene algunos significados diferentes no relacionados en C ++
Cuando se usa para miembros de datos significa que los datos se asignan en la clase y no en instancias.
Cuando se usa para datos dentro de una función, significa que los datos se asignan estáticamente, se inicializan la primera vez que se ingresa el bloque y duran hasta que se cierra el programa. Además, la variable solo es visible dentro de la función. Esta característica especial de las estadísticas locales a menudo se usa para implementar la construcción perezosa de singletons.
Cuando se usa en un nivel de unidad de compilación (módulo) significa que la variable es como una global (es decir, asignada e inicializada antes de main
ejecutarse y destruirse después de las main
salidas) pero que la variable no será accesible ni visible en otras unidades de compilación .
Agregué énfasis en la parte que es más importante para cada uso. Se desaconseja el uso (3) a favor de espacios de nombres sin nombre que también permiten declaraciones de clase no exportadas.
En su código, la static
palabra clave se usa con el significado número 2 y no tiene nada que ver con clases o instancias ... es una variable de la función y solo habrá una copia de ella.
Como dijo correctamente iammilind , sin embargo, podría haber habido múltiples instancias de esa variable si la función fuera una función de plantilla (porque en ese caso, de hecho, la función en sí misma puede estar presente en muchas copias diferentes en el programa). Incluso en ese caso, por supuesto, las clases y las instancias son irrelevantes ... vea el siguiente ejemplo:
#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 para la instancia, de modo que, por ejemplo,o1.foo(); // i = 1
y$o2.foo(); // i = 1
...?