Miembros estáticos de una clase C ++

Podemos definir miembros de clase estáticos usando staticpalabra clave. 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 podemos ponerlo en la definición de 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:

#include <iostream>
 
using namespace std;

class Box {
   public:
      static int objectCount;
      
      // Constructor definition
      Box(double l = 2.0, double b = 2.0, double h = 2.0) {
         cout <<"Constructor called." << endl;
         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
};

// Initialize static member of class Box
int Box::objectCount = 0;

int main(void) {
   Box Box1(3.3, 1.2, 1.5);    // Declare box1
   Box Box2(8.5, 6.0, 2.0);    // Declare box2

   // Print total number of objects.
   cout << "Total objects: " << Box::objectCount << endl;

   return 0;
}

Cuando el código anterior se compila y ejecuta, 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 utilizando 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 funciones estáticas:

#include <iostream>
 
using namespace std;

class Box {
   public:
      static int objectCount;
      
      // Constructor definition
      Box(double l = 2.0, double b = 2.0, double h = 2.0) {
         cout <<"Constructor called." << endl;
         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
};

// Initialize static member of class Box
int Box::objectCount = 0;

int main(void) {
   // Print total number of objects before creating object.
   cout << "Inital Stage Count: " << Box::getCount() << endl;

   Box Box1(3.3, 1.2, 1.5);    // Declare box1
   Box Box2(8.5, 6.0, 2.0);    // Declare box2

   // Print total number of objects after creating object.
   cout << "Final Stage Count: " << Box::getCount() << endl;

   return 0;
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

Inital Stage Count: 0
Constructor called.
Constructor called.
Final Stage Count: 2