53 - Métodos estáticos de una clase


Las funciones o métodos de la clase pueden definirse de tipo estático.

Un método estático solo puede acceder a los atributos estáticos declarados en la clase.

No se pueden definir dos funciones con igual nombre y que una sea estática y la otra no.

Un método estático se lo puede llamar sin la necesitad de crear un objeto de dicha clase. Para poder llamarlo debemos anteceder el nombre de la clase y el modificador :: (dos veces dos puntos).

Problema 1:

Plantear una clase que defina un atributo y un método estático. Desde la main llamar al método estático sin tener que crear un objeto de dicha clase.

Programa:

#include<iostream>

using namespace std;

class Prueba {
    static int x1;
public:
    static int retornarX();
};

int Prueba::x1 = 20;

int Prueba::retornarX()
{
    return x1;
}

int main()
{
    cout << Prueba::retornarX(); // 20
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : MetodoEstatico1.zip

Veamos el programa mínimo para crear un atributo estática y un método estático. Primero declaramos el atributo estático y el método estático en la declaración de la clase antecediendo la palabra clave static:

class Prueba {
    static int x1;
public:
    static int retornarX();
};

Definimos e inicializamos la variable estática con el valor 20:

int Prueba::x1 = 20;

La implementación del método estático es similar a lo ya visto teniendo en cuenta que dentro de dicho método solo podemos acceder a atributos estáticos (tengamos en cuenta que este método se crea y existe independientemente a que se creen objetos de la clase Prueba)

Finalmente podemos ver que para acceder a dicho método no es necesario crear un objeto de la clase Prueba, solo con anteceder al nombre del método con el nombre de la clase y los caracteres :: tenemos acceso:

int main()
{
    cout << Prueba::retornarX(); // 20
    return 0;
}

Problema 2:

Plantear una clase Cuenta que defina dos atributos, uno que almacene el importe de la misma y otro atributo estático llamado cantidad que se debe incrementar en uno cada vez que se crea un objeto de dicha clase, definir en esta misma clase un método estático que retorne el contandor cantidad. Por otro lado crear una clase Banco que defina tres objetos de la clase Cuenta. Imprimir la cantidad de cuentas llamando al método estático de la clase Cuenta.

#include<iostream>

using namespace std;

class Cuenta {
    float saldo;
    static int cantidad;
public:
    Cuenta(float sal) { saldo = sal; cantidad++; };
    static int retornarCantidad() { return cantidad; };
};

int Cuenta::cantidad = 0;

class Banco {
    Cuenta *cuenta1, *cuenta2, *cuenta3;
public:
    Banco();
    ~Banco();
    void cantidadClientes();
};

Banco::Banco()
{
    cuenta1 = new Cuenta(1000);
    cuenta2 = new Cuenta(3000);
    cuenta3 = new Cuenta(5000);
}

Banco::~Banco()
{
    delete cuenta1;
    delete cuenta2;
    delete cuenta3;
}

void Banco::cantidadClientes()
{
    cout << Cuenta::retornarCantidad();
}

int main()
{
    Banco *banco1 = new Banco();
    banco1->cantidadClientes();
    delete banco1;
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : MetodoEstatico2.zip

Declaramos la clase Cuenta con un atributo estático llamado cantidad y un método estático llamado retornarCantidad, el método estático puede acceder al atributo cantidad y no al de saldo ya que cantidad está declarado de tipo static.

class Cuenta {
    float saldo;
    static int cantidad;
public:
    Cuenta(float sal) { saldo = sal; cantidad++; };
    static int retornarCantidad() { return cantidad; };
};

Para llamar al método static desde la clase Banco lo hacemos directamente con el nombre de la clase seguido por el operador :: y el nombre del método estático:

void Banco::cantidadClientes()
{
    cout << Cuenta::retornarCantidad();
}

De todas forma funciona igual si llamamos al método estático por medio de un objeto de dicha clase:

void Banco::cantidadClientes()
{
    cout << cuenta1->retornarCantidad();
}

Retornar