Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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
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;
}
Ejemplo 01:
#include <iostream>
using namespace std;
class C {
public:
static int x;
};
int C::x = 13;
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;
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();
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();
}
void Numero::CalculaMedia() {
if (Cuenta > 0)
Media = Suma/Cuenta;
else
Media = 0;
}
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.
#include <iostream>
using namespace std;
class Numero {
private:
int Valor;
static int ObjetosDeclarados;
public:
Numero(int v = 0);
Numero::Numero(int v) : Valor(v) {
ObjetosDeclarados++;
}
int Numero::ObjetosDeclarados = 0;
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;
}
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.