Está en la página 1de 7

Metodología de la Programación Dr.

Edelfré Flores Velásquez

CLASES MIEMBRO static (estáticos)

Una variable estática de una clase representa información “intrínseca de la clase” (es decir,
propia de la clase, no de un objeto específico de la clase). La declaración de un miembro
estático comienza con la palabra reservada static.

En el caso de los datos miembro static sólo existirá una copia que compartirán todos los
objetos de la misma clase. 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.

Cada vez que se define un objeto a partir de una clase concreta los elementos de datos se
duplican. Es decir, los atributos de diferentes instancias de objetos de la misma clase son
independientes y ocupan posiciones diferentes de memoria. Si se desea que todos los objetos
instanciados de una clase compartan una sola copia de un atributo, se puede definir el
atributo como static. Esto se puede utilizar como una forma de comunicación entre los
objetos.

Se puede declarar private, y sólo podrán acceder a él las funciones miembro, o public con lo
que será accesible al resto del programa.

Un ejemplo de un miembro estático privado puede ser:

class Cuenta {
char nombre[50];
float total;
static float incremento;
public:
Cuenta ();
void Interes() {
total += incremento*total;
}
};

En el ejemplo anterior sólo existe una copia de incremento, y es accesible por todas las
instancias de la clase Cuenta. Cada vez que se llame al método Interes por cualquier objeto
de la clase Cuenta, se empleará el mismo valor de incremento, compartido por todas las
instancias.

La siguiente figura ilustra este ejemplo suponiendo que se han definido tres objetos. Se
observa como incremento es un miembro común a los tres objetos.
Metodología de la Programación Dr. Edelfré Flores Velásquez

Por ejemplo, si incremento fuera un miembro público, se podría acceder a él de la siguiente


manera:
// Si incremento fuera público
void main () {
Cuenta micuenta;
micuenta.incremento=0.000154;
}

Sin embargo, esta sintaxis no es la más apropiada, ya que parece indicar que sólo el
incremento del objeto micuenta es modificado, cuando lo que realmente ocurre es que el
incremento de todos los objetos instanciados de la clase Cuenta se ven afectados por la
modificación. Así la mejor manera de referenciar un miembro estático es utilizando el nombre
de la clase:
// Si incremento fuera público
void main () {
Cuenta::incremento=0.000154;
}

Un ejemplo completo del uso de datos miembros estáticos es el que sigue:

Ejemplo 01:

#include <iostream>
using namespace std;
class C {
public:
static int x;
};
int C::x = 13;

int main(int argc, char *argv[]) {


C c1, c2;
cout << "Valor c1.x == " << c1.x << endl;
cout << "Valor c2.x == " << c2.x << endl;
Metodología de la Programación Dr. Edelfré Flores Velásquez

c1.x = 22; //modifica todos los miembros x a 22

cout << "Valor c1.x == " << c1.x << endl;


cout << "Valor c2.x == " << c2.x << endl;

return 0;
}

Como resumen, las ventajas que ofrecen los miembros dato estáticos son:
 Permiten la comunicación entre objetos, reduciendo la necesidad de variables globales.
 Ahorra en almacenamiento, ya que el atributo estático comparte la misma zona de
memoria para todas las instancias de la clase.
 Hacen evidentes los datos que pueden ser compartidos dentro de una clase.

Otro ejemplo:

Ejemplo 02:

#include <iostream>
using namespace std;
class alumno {
public:
static int codigo;

alumno(){
codigo++;
}

void totalAlumnos(){
cout<<"Hay " << codigo<<" alumnos";
}
};

int alumno::codigo = 0;

int main(int argc, char *argv[]) {

cout<<alumno::codigo<<endl;

alumno a1;
alumno a2;
alumno a3;
Metodología de la Programación Dr. Edelfré Flores Velásquez

alumno a4;

cout<<alumno::codigo<<endl;

a1.totalAlumnos();

return 0;
}

Otro ejemplo:

Ejemplo 03:

#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;
Metodología de la Programación Dr. Edelfré Flores Velásquez

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;
int Numero::Suma = 0;
int Numero::Media = 0;

void Numero::CalculaMedia() {
if (Cuenta > 0)
Media = Suma/Cuenta;
else
Media = 0;
}

int main(int argc, char *argv[]) {


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;
Metodología de la Programación Dr. Edelfré Flores Velásquez

return 0;
}

Observa 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.

FUNCIONES MIEMBRO static

En el caso de la funciones miembro static la utilidad es menos evidente. Estas funciones no


pueden acceder a los miembros de los objetos, sólo pueden acceder a los datos miembro de
la clase que sean static. Esto significa que no tienen acceso al puntero this, y además suelen
ser usadas con su nombre completo, incluyendo el nombre de la clase y el operador de ámbito
(::).

#include <iostream>
using namespace std;
class Numero {
private:
int Valor;
static int ObjetosDeclarados;

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;
}
};

Numero::Numero(int v) : Valor(v) {
ObjetosDeclarados++;
}

int Numero::ObjetosDeclarados = 0;

int main(int argc, char *argv[]) {


Metodología de la Programación Dr. Edelfré Flores Velásquez

Numero A(6), B(3), C(9), D(18), E(3);


Numero *X;

cout << "INICIAL" << endl;


cout << "Objetos de la clase Numeros: "
<< A.LeeDeclaraciones() << endl;

Numero::Reset();
cout << "RESET" << endl;
cout << "Objetos de la clase Numeros: "
<< A.LeeDeclaraciones() << endl;

X = new Numero(548);
cout << "Cuenta de objetos dinámicos declarados" << endl;
cout << "Objetos de la clase Numeros: "
<< A.LeeDeclaraciones() << endl;

delete X;
X = new Numero(8);
cout << "Cuenta de objetos dinámicos declarados" << endl;
cout << "Objetos de la clase Numeros: "
<< A.LeeDeclaraciones() << endl;

delete X;
return 0;
}

Ejercicio a resolver en clase

Cree una clase llamada CuentaAhorros. Use un miembro de datos static llamado
tasaInteresAnual para almacenar la tasa de interés anual para cada uno de los ahorradores.
Cada miembro de la clase debe contener un miembro de datos private llamado saldoAhorros,
que indiquen el monto que tiene el ahorrador actualmente en depósito. Proporcione la
función miembro calcularInteresMensual que calcule el interés mensual multiplicando el
saldoAhorros por tasaInteresAnual dividido entre 12, este interés debe sumarse a
saldoAhorros. Cree instancias de la clase y utilice las funciones miembro.

También podría gustarte