¿Alguien puede explicar cómo funcionan las variables estáticas en las funciones miembro en C ++?
Dada la siguiente clase:
class A {
void foo() {
static int i;
i++;
}
}
Si declaro varias instancias de A
, ¿llamar foo()
a una instancia incrementa la variable estática i
en todas las instancias? ¿O solo el que fue llamado?
Supuse que cada instancia tendría su propia copia i
, pero al pasar por algún código que tengo parece indicar lo contrario.
static int i
específico para la instancia, de modo que, por ejemplo,o1.foo(); // i = 1
y$o2.foo(); // i = 1
...?m_
para indicar el estado de i.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 lasmain
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:
fuente
keyword static unfortunately has a few different unrelated meanings in C++
:)Variables estáticas dentro de funciones
La variable estática se crea dentro de una función que se almacena en la memoria estática del programa, no en la pila.
La inicialización de la variable estática se realizará en la primera llamada de la función.
La variable estática retendrá el valor en múltiples llamadas a funciones
La vida útil de la variable estática es Programa
Ejemplos
Salida:
Variable estática
Valor variable: 0
Valor variable: 1
Valor variable: 2
Valor variable: 3
Valor variable: 4
Variable automática
Valor variable: 0
Valor variable: 0
Valor variable: 0
Valor variable: 0
Valor variable: 0
fuente
Respuesta simplificada:
Las variables estáticas, independientemente de si son miembros de una función (sin plantilla)
class
o una función (sin plantilla), se comportan, técnicamente, como una etiqueta global cuyo alcance está limitado a laclass
función o.fuente
MyClass& instance(){ static MyClass x("config.ini"); return x; }
: una implementación portátil válida para uso de un solo hilo exactamente porque las estadísticas locales NO son simplemente globales a pesar de lo que usted dice.