Programación D: miembros estáticos de una clase
Podemos definir a los miembros de la clase staticusando una palabra clave estática. Cuando declaramos un miembro de una clase como estático, significa que no importa cuántos objetos de la clase se creen, solo hay una copia del miembro estático.
Todos los objetos de la clase comparten un miembro estático. Todos los datos estáticos se inicializan a cero cuando se crea el primer objeto, si no hay otra inicialización presente. No se puede poner en la definición de la clase, pero se puede inicializar fuera de la clase como se hace en el siguiente ejemplo al volver a declarar la variable estática, usando el operador de resolución de alcance :: para identificar a qué clase pertenece.
Intentemos el siguiente ejemplo para comprender el concepto de miembros de datos estáticos:
import std.stdio;
class Box {
public:
static int objectCount = 0;
// Constructor definition
this(double l = 2.0, double b = 2.0, double h = 2.0) {
writeln("Constructor called.");
length = l;
breadth = b;
height = h;
// Increase every time object is created
objectCount++;
}
double Volume() {
return length * breadth * height;
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
void main() {
Box Box1 = new Box(3.3, 1.2, 1.5); // Declare box1
Box Box2 = new Box(8.5, 6.0, 2.0); // Declare box2
// Print total number of objects.
writeln("Total objects: ",Box.objectCount);
}
Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:
Constructor called.
Constructor called.
Total objects: 2
Miembros de funciones estáticas
Al declarar un miembro de función como estático, lo hace independiente de cualquier objeto particular de la clase. Se puede llamar a una función miembro estática incluso si no existen objetos de la clase y elstatic se accede a las funciones usando solo el nombre de la clase y el operador de resolución de alcance ::.
Una función miembro estática sólo puede acceder a miembros de datos estáticos, otras funciones miembro estáticas y cualquier otra función desde fuera de la clase.
Las funciones miembro estáticas tienen un ámbito de clase y no tienen acceso al thispuntero de la clase. Puede utilizar una función miembro estática para determinar si se han creado o no algunos objetos de la clase.
Probemos el siguiente ejemplo para comprender el concepto de miembros de función estática:
import std.stdio;
class Box {
public:
static int objectCount = 0;
// Constructor definition
this(double l = 2.0, double b = 2.0, double h = 2.0) {
writeln("Constructor called.");
length = l;
breadth = b;
height = h;
// Increase every time object is created
objectCount++;
}
double Volume() {
return length * breadth * height;
}
static int getCount() {
return objectCount;
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
void main() {
// Print total number of objects before creating object.
writeln("Inital Stage Count: ",Box.getCount());
Box Box1 = new Box(3.3, 1.2, 1.5); // Declare box1
Box Box2 = new Box(8.5, 6.0, 2.0); // Declare box2
// Print total number of objects after creating object.
writeln("Final Stage Count: ",Box.getCount());
}
Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:
Inital Stage Count: 0
Constructor called.
Constructor called
Final Stage Count: 2