Miembros estáticos de clases

En programación orientada a objetos, cada instancia de una clase suele tener sus propios atributos y métodos (miembros de datos), lo que permite que cada objeto mantenga su propio estado. Sin embargo, en ciertos casos, es necesario disponer de información compartida por todas las instancias de una clase. Para ello, C++ proporciona los miembros estáticos.

¿Qué es un miembro estático?

Un miembro estático es un miembro (atributo o método) de una clase que pertenece a la clase en sí, y no a las instancias individuales. Esto significa que:

  • Existe una sola copia compartida por todas las instancias.
  • Puede accederse sin necesidad de crear un objeto (usando el nombre de la clase).
  • La declaración de un miembro estático se realiza dentro de la clase.
  • Su inicialización se hace fuera de la clase.

Ejemplo de atributo estático

Quemos contar el números de tickets que se crean. Veamos el ejemplo:

#include <iostream>
#include <string>

class Ticket {
private:
    std::string asunto;
    int id;

public:
    // Atributo estático: contador de tickets creados
    static int contadorTickets;

    // Constructor usando lista de inicialización
    Ticket(const std::string& asunto_) 
        : asunto{asunto_}, id{++contadorTickets} 
    {
        std::cout << "Ticket creado: " << id << " - " << asunto << '\n';
    }

    int getId() const { 
        return id; 
    }

    const std::string& getAsunto() const { 
        return asunto; 
    }

};

// Inicialización del atributo estático (fuera de main)
int Ticket::contadorTickets = 0;

int main() {
    Ticket t1("Problema con la impresora");
    Ticket t2("Fallo en el correo");
    Ticket t3("Solicitud de acceso a la VPN");

    std::cout << "\nTotal tickets creados: " << Ticket::contadorTickets << '\n';

    return 0;
}

Ejemplo de métodos estático

En este caso declaramos el atributo estático como privado y necesitamos un método estático que nos permita obtener el valor de ese atributo.

#include <iostream>
#include <string>

class Ticket {
private:
    std::string asunto;
    int id;

    // Atributo estático: contador de tickets creados
    static int contadorTickets;

public:
    // Constructor usando lista de inicialización
    Ticket(const std::string& asunto_) 
        : asunto{asunto_}, id{++contadorTickets} 
    {
        std::cout << "Ticket creado: " << id << " - " << asunto << '\n';
    }

    int getId() const { 
        return id; 
    }

    const std::string& getAsunto() const { 
        return asunto; 
    }

    // Método estático para acceder al contador
    static int totalTicketsCreados() { 
        return contadorTickets; 
    }
};

// Inicialización del atributo estático (fuera de la clase)
int Ticket::contadorTickets = 0;

int main() {
    Ticket t1("Problema con la impresora");
    Ticket t2("Fallo en el correo");
    Ticket t3("Solicitud de acceso a la VPN");

    std::cout << "\nTotal tickets creados: " 
              << Ticket::totalTicketsCreados() << '\n';

    return 0;
}