Historia de la pregunta
Los miembros estáticos de las clases aparecieron en C++ para permitir almacenar un valor o función común para todos los objetos, no vinculada a una instancia particular de la clase. Esto es útil para almacenar, por ejemplo, contadores, fábricas de objetos o funciones auxiliares.
Problema
Una de las complejidades siempre ha sido el ámbito y el momento de inicialización de tales miembros, especialmente si hay muchos archivos fuente en el programa. Definir incorrectamente un miembro estático conduce a errores de enlace (linker errors).
Solución
En C++, los miembros estáticos se declaran en la definición de la clase, pero su inicialización (para variables) debe ocurrir por separado en el archivo cpp (hasta C++17). C++17 permite la inicialización directamente dentro de la declaración, si es constexpr.
Ejemplo de código:
class MyClass { public: static int counter; static void increment() { ++counter; } }; int MyClass::counter = 0; // la inicialización es OBLIGATORIA fuera de la clase
Características clave:
¿Qué sucede si no se define un miembro estático en el archivo cpp?
Obtendrá un error de enlace (linker error) porque la variable estática será declarada, pero no definida. La excepción es si static const int se inicializa directamente dentro de la clase para un valor constexpr.
// .h class A { public: static int x; }; // .cpp // int A::x = 0; // si está comentado — ocurrirá un error
¿Se puede llamar a una función no estática desde una estática?
No. La función estática no tiene acceso al puntero this ni a miembros no estáticos directamente. Se necesita un objeto específico para acceder.
class B { int data; static void foo() { // data = 3; // error } };
¿Son las variables estáticas comunes para todas las instancias?
Sí, dentro de un archivo ejecutable y proceso — el mismo valor para todas las instancias.
El equipo olvidó definir el miembro estático en el archivo cpp, el proyecto se compila periódicamente con errores, y a veces, al usar la inicialización en línea (no en todos los compiladores), aparece un error de ejecución "misterioso".
Pros:
Contras:
En la empresa hay una regla: los miembros estáticos siempre están definidos en archivos cpp para cada clase. Para la seguridad en hilos se utilizan std::mutex o operaciones atómicas.
Pros:
Contras: