Los miembros static de una clase existen en una única instancia para toda la clase, un valor compartido por todos los objetos.
int Foo::count = 0;). Dentro de la clase, solo declaramos y definimos fuera.this), solo pueden acceder a otros miembros static.class Counter { public: static int count; static void increment() { ++count; } }; int Counter::count = 0; int main() { Counter::increment(); Counter c1, c2; c1.increment(); // count == 2 }
«¿Puede la definición de un miembro estático estar dentro de un archivo de cabecera? ¿Qué riesgos surgen?»
Respuesta: Sí, la definición (int Foo::value = 0;) dentro del encabezado es técnicamente posible, pero si este encabezado se incluye en varias unidades de traducción, provocará duplicación (multiple definition), lo que causará errores de enlace. Por lo tanto, los miembros estáticos deben definirse solo en un archivo cpp.
Historia
En el código de la biblioteca, el miembro estático se definió directamente en el archivo de cabecera. La inclusión múltiple provocó errores de enlace: "multiple definition of ...". Después de mover la definición a un archivo cpp separado, el problema desapareció.
Historia
En un proyecto educativo, se declaró un miembro estático, pero se olvidaron de definirlo en el archivo cpp externo. A pesar de no haber errores al compilar los encabezados, se produjo un error de simbolo externo no resuelto durante el enlace. Fue necesario buscar y agregar la definición faltante.
Historia
En un gran sistema embebido, se implementó incorrectamente la inicialización del miembro estático con un valor calculado (intentaron inicializarlo a través de una expresión que requiere la ejecución de código). Se separó la lógica en una función de inicialización, pero por descuido se olvidaron de llamar a esa función antes del primer acceso; como resultado, se obtuvieron variables no inicializadas y un comportamiento errático.