Ejercicios de Clases
3. Métodos Static
Recordemos de manera genérica como se organiza la memoria de un Programa.
Lo que sea declarado con la palabra STATIC, será una zona común para TODOS los objetos que sean de la misma clase.
Es evidente que esto no es importante para un método o función, ya que NO tiene datos.
Pero para el caso de Métodos declarados como STATIC, permiten acceder a los datos
miembro de la clase que sean static.
Esto significa que no tienen puntero this, y además suelen ser usadas con su nombre completo, incluyendo el nombre de la clase y el operador de ámbito (::).
Vemos en el Ejemplo siguiente que si comento la línea
// static int ObjetosDeclarados;//Datios Static
//int ObjetosDeclarados;//Datios Static
Al intentar compilar va a titrar un error por que intentamos usar un método NO STATIC para borrar una variable STATICPor ejemplo:
#include
using namespace std;
class Numero {
public:
Numero(int v = 0);
void Modifica(int v) { Valor = v; }
int LeeValor() const { return Valor; }
int LeeDeclaraciones() const { return ObjetosDeclarados; }
static void Reset() { ObjetosDeclarados = 0; }//Método Static
private:
int Valor;
static int ObjetosDeclarados;//Datios Static
//int ObjetosDeclarados;//Datios Static
};
Numero::Numero(int v) : Valor(v) {
ObjetosDeclarados++;
}
int Numero::ObjetosDeclarados = 0;
int main() {
Numero A(6), B(3), C(9), D(18), E(3);//Varios Objetos.
Numero *X;//Puntero al Objeto.
cout << "INICIAL" << endl;
cout << "Objetos de la clase Numeros: "
<< A.LeeDeclaraciones() << endl;
Numero::Reset();//Método Static modifica Datos Static.
cout << "RESET" << endl;
cout << "Objetos de la clase Numeros: (Metodo Static modifica Datos Static) "
<< A.LeeDeclaraciones() << endl;
X = new Numero(548);
cout << "Cuenta de objetos dinamicos declarados" << endl;
cout << "Objetos de la clase Numeros: "
<< A.LeeDeclaraciones() << endl;
delete X;
X = new Numero(8);
cout << "Cuenta de objetos dinamicos declarados" << endl;
cout << "Objetos de la clase Numeros: "
<< A.LeeDeclaraciones() << endl;
delete X;
cin.get();
return 0;
}
Observa cómo hemos llamado a la función Reset con su nombre completo. Aunque podríamos haber usado "A.Reset()", es más lógico usar el nombre completo, ya que la función puede ser invocada aunque no exista ningún objeto de la clase.