C++ Miembros estáticos de la clase

C++ 类 & 对象Clases y objetos en C++

Podemos usarstaticla palabra clave para definir miembros de la clase como estáticos. Cuando declaramos un miembro de la clase como estático, esto significa que sin importar cuántos objetos de la clase se creen, el miembro estático tiene una sola copia.

Los miembros estáticos se comparten entre todos los objetos de la clase. Si no hay otras declaraciones de inicialización, cuando se crea el primer objeto, todos los datos estáticos se inicializan a cero. No podemos colocar la inicialización de miembros estáticos dentro de la definición de la clase, pero podemos hacerlo fuera de la clase usando el operador de resolución de ámbito::para redeclarar la variable estática e inicializarla, como se muestra en el siguiente ejemplo.

El siguiente ejemplo ayuda a entender mejor el concepto de datos miembros estáticos:

Ejemplo

#include <iostream> using namespace std; class Box { public: static int objectCount; // Definición del constructor Box(double l=2.0, double b=2.0, double h=2.0) { cout <<"Constructor called." << endl; length = l; breadth = b; height = h; // Incrementa en 1 cada vez que se crea un objeto objectCount++; } double Volume() { return length * breadth * height; } private: double length; // Largo double breadth; // Ancho double height; // Alto }; // Inicializar el miembro estático de la clase Box int Box::objectCount = 0; int main(void) { Box Box1(3.3, 1.2, 1.5); // Declarar box1 Box Box2(8.5, 6.0, 2.0); // Declarar box2 // Mostrar el número total de objetos 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

Funciones miembro estáticas

Si se declara un miembro de función como estático, se puede independizar la función de cualquier objeto específico de la clase. Las funciones miembro estáticas se pueden invocar incluso cuando no existen objetos de la clase,Las funciones estáticassolo necesitan usar el nombre de la clase y el operador de resolución de ámbito::para poder acceder.

Las funciones miembro estáticas solo pueden acceder a datos miembros estáticos, otras funciones miembro estáticas y otras funciones fuera de la clase.

Las funciones miembro estáticas tienen un ámbito de clase; no pueden acceder al puntero `this` de la clase. Se pueden usar funciones miembro estáticas para determinar si ciertos objetos de la clase han sido creados.

Diferencias entre las funciones miembro estáticas y las funciones miembro normales:

  • Las funciones miembro estáticas no tienen puntero `this` y solo pueden acceder a miembros estáticos (incluyendo variables miembro estáticas y funciones miembro estáticas).
  • Las funciones miembro normales tienen puntero `this` y pueden acceder a cualquier miembro de la clase; mientras que las funciones miembro estáticas no tienen puntero `this`.

El siguiente ejemplo ayuda a entender mejor el concepto de funciones miembro estáticas:

Ejemplo

#include <iostream> using namespace std; class Box { public: static int objectCount; // Definición del constructor Box(double l=2.0, double b=2.0, double h=2.0) { cout <<"Constructor called." << endl; length = l; breadth = b; height = h; // Incrementa en 1 cada vez que se crea un objeto objectCount++; } double Volume() { return length * breadth * height; } static int getCount() { return objectCount; } private: double length; // Largo double breadth; // Ancho double height; // Alto }; // Inicializar el miembro estático de la clase Box int Box::objectCount = 0; int main(void) { // Mostrar el número total de objetos antes de crear objetos cout << "Inital Stage Count: " << Box::getCount() << endl; Box Box1(3.3, 1.2, 1.5); // Declarar box1 Box Box2(8.5, 6.0, 2.0); // Declarar box2 // Mostrar el número total de objetos después de crear objetos 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

C++ 类 & 对象Clases y objetos en C++

Otras extensiones