11. Miembros estáticos de una clase (Static)

Ciertos miembros de una clase pueden ser declarados como static. Los miembros static tienen algunas propiedades especiales.

En el caso de los datos miembro static sólo existirá una copia que compartirán todos los objetos de la misma clase.

Es decir todos los objetos COMPARTEN PROPIEDADES!!.

Si consultamos el valor de ese dato desde cualquier objeto de esa clase obtendremos siempre el mismo resultado, y si lo modificamos, lo modificaremos para todos los objetos.

Observar que es necesario declarar e inicializar los miembros static de la clase, esto es por dos motivos. El primero es que los miembros static deben existir aunque no exista ningún objeto de la clase, declarar la clase no crea los datos miembro estáticos, es necesario hacerlo explícitamente. El segundo es porque si no lo hiciéramos, al declarar objetos de esa clase los valores de los miembros estáticos estarían indefinidos, y los resultados no serían los esperados.


Por ejemplo:


#include <iostream>
using namespace std;
class showstatic{
public: 
static int nStatic;    // Valor de nStatic es el mismo entre cada llamado de != objetos            
void mostrar(void){cout << "nStatic = " << nStatic << endl;}
void cargar(int y){nStatic=y;}
};

int showstatic::nStatic=1;  //IMPORTANTE DEBO inicializar static en la clase!!

int main() {
int x;
showstatic Objeto1, Objeto2;
cout<<"Ingrese un valor para la variable static de Objeto1:" <<endl;
cin>>x;
Objeto1.cargar( x );
cout<<"Mostramos la varaible en Objeto2 que no fue inicializado :" <<endl;
Objeto2.mostrar();
cout<<" Por tal motivo vemos que la variable Static <<endl;
cout<<" es comun para los dos Objetos"<<endl;
}

Otro ejemplo:

DEBO inicializar static en la clase!!
#include <iostream> using namespace std; class Numero { public: Numero(int v = 0); ~Numero(); void Modifica(int v); int LeeValor() const { return Valor; } int LeeCuenta() const { return Cuenta; } int LeeMedia() const { return Media; } private: int Valor; static int Cuenta; static int Suma; static int Media; void CalculaMedia(); }; Numero::Numero(int v) : Valor(v) { Cuenta++; Suma += Valor; CalculaMedia(); } Numero::~Numero() { Cuenta--; Suma -= Valor; CalculaMedia(); } void Numero::Modifica(int v) { Suma -= Valor; Valor = v; Suma += Valor; CalculaMedia(); } // Definición e inicialización de miembros estáticos int Numero::Cuenta = 0; //IMPORTANTE debo inicializar static!! int Numero::Suma = 0; //IMPORTANTE debo inicializar static!! int Numero::Media = 0; //IMPORTANTE debo inicializar static!! void Numero::CalculaMedia() { if(Cuenta > 0) Media = Suma/Cuenta; else Media = 0; } int main() { Numero A(6), B(3), C(9), D(18), E(3); Numero *X; cout << "INICIAL" << endl; cout << "Cuenta: " << A.LeeCuenta() << endl; cout << "Media: " << A.LeeMedia() << endl; B.Modifica(11); cout << "Modificamos B=11" << endl; cout << "Cuenta: " << B.LeeCuenta() << endl; cout << "Media: " << B.LeeMedia() << endl; X = new Numero(548); cout << "Nuevo elemento dinámico de valor 548" << endl; cout << "Cuenta: " << X->LeeCuenta() << endl; cout << "Media: " << X->LeeMedia() << endl; delete X; cout << "Borramos el elemento dinámico" << endl; cout << "Cuenta: " << D.LeeCuenta() << endl; cout << "Media: " << D.LeeMedia() << endl; cin.get(); return 0; }