Variables estáticas en C ++

Me gustaría saber cuál es la diferencia entre las variables estáticas en un archivo de encabezado frente a las declaradas en una clase. Cuando la variable estática se declara en un archivo de cabecera, su scope se limita al archivo .h o en todas las unidades. Además, en general, la variable estática se inicializa en el archivo .cpp cuando se declara en una clase, ¿verdad? Entonces, ¿eso significa que el scope de la variable estática está limitado a 2 unidades de comstackción?

Discúlpeme cuando contesto sus preguntas fuera de orden, lo hace más fácil de entender de esta manera.

Cuando la variable estática se declara en un archivo de cabecera, su scope se limita al archivo .h o en todas las unidades.

No existe el “scope del archivo de encabezado”. El archivo de encabezado se incluye en los archivos de origen. La unidad de traducción es el archivo de origen que incluye el texto de los archivos de encabezado. Cualquier cosa que escriba en un archivo de encabezado se copia en cada archivo fuente incluido.

Como tal, una variable estática declarada en un archivo de encabezado es como una variable estática en cada archivo fuente individual.

Como declarar una variable static esta manera significa vinculación interna, cada unidad de traducción #include su archivo de encabezado obtiene su propia variable individual (que no es visible fuera de su unidad de traducción). Esto usualmente no es lo que quieres.

Me gustaría saber cuál es la diferencia entre las variables estáticas en un archivo de encabezado frente a las declaradas en una clase.

En una statement de clase, static significa que todas las instancias de la clase comparten esta variable miembro; es decir, puede tener cientos de objetos de este tipo, pero cada vez que uno de estos objetos se refiere a la variable static (o “clase”), tiene el mismo valor para todos los objetos. Podrías pensar que es una “clase global”.

Además, en general, la variable estática se inicializa en el archivo .cpp cuando se declara en una clase, ¿verdad?

Sí, una (y solo una ) unidad de traducción debe inicializar la variable de clase.

Entonces, ¿eso significa que el scope de la variable estática está limitado a 2 unidades de comstackción?

Como ya he dicho:

  • Un encabezado no es una unidad de comstackción,
  • static significa cosas completamente diferentes dependiendo del contexto.

Alcance de límites static globales para la unidad de traducción. Clase static significa global para todas las instancias.

Espero que esto ayude.

PD: consulte el último párrafo de la respuesta de Chubsdad, acerca de cómo no debe usar static en C ++ para indicar enlaces internos, sino espacios de nombres anónimos. (Porque tiene razón; ;-))

Variable estática en un archivo de encabezado:

decir 'common.h' tiene

 static int zzz; 

Esta variable 'zzz' tiene un enlace interno (no se puede acceder a esta misma variable en otras unidades de traducción). Cada unidad de traducción que incluye 'common.h' tiene su propio objeto único de nombre 'zzz' .

Variable estática en una clase:

La variable estática en una clase no es parte del subobjeto de la clase. Solo hay una copia de un miembro de datos estáticos compartida por todos los objetos de la clase.

$ 9.4.2 / 6 – “Los miembros de datos estáticos de una clase en el ámbito del espacio de nombres tienen un enlace externo (3.5). Una clase local no debe tener miembros de datos estáticos.”

Digamos que 'myclass.h' tiene

 struct myclass{ static int zzz; // this is only a declaration }; 

y myclass.cpp tiene

 #include "myclass.h" int myclass::zzz = 0 // this is a definition, // should be done once and only once 

y "hisclass.cpp" tiene

 #include "myclass.h" void f(){myclass::zzz = 2;} // myclass::zzz is always the same in any // translation unit 

y "ourclass.cpp" tiene

 #include "myclass.h" void g(){myclass::zzz = 2;} // myclass::zzz is always the same in any // translation unit 

Por lo tanto, los miembros estáticos de clase no están limitados a solo 2 unidades de traducción. Deben definirse solo una vez en cualquiera de las unidades de traducción.

Nota: el uso de ‘estático’ para declarar la variable del scope del archivo está en desuso y el espacio de nombre sin nombre es una alternativa superior

Una variable estática declarada en un archivo de encabezado fuera de la clase tendría un file-scoped en cada archivo .c que incluye el encabezado. Eso significa que se puede acceder a una copia separada de una variable con el mismo nombre en cada uno de los archivos .c donde se incluye el archivo de encabezado.

Por otro lado, una variable de clase estática tiene class-scoped y la misma variable estática está disponible para cada unidad de comstackción que incluye el encabezado que contiene la clase con la variable estática.

    Intereting Posts