Asignación de memoria en miembros de datos estáticos en C++

C++ permite definir miembros de datos estáticos dentro de una clase utilizando la palabra clave estática . Cuando un miembro de datos se declara como estático, entonces debemos tener en cuenta la siguiente nota:

  • Independientemente de la cantidad de objetos creados, solo se crea una única copia del miembro estático en la memoria.
  • Todos los objetos de una clase comparten el miembro estático.
  • Todos los miembros de datos estáticos se inician a cero cuando se crea el primer objeto de esa clase.
  • Los miembros de datos estáticos son visibles solo dentro de la clase , pero su tiempo de vida es el programa completo.

Relevancia:
los miembros de datos estáticos generalmente se usan para mantener valores que son comunes para toda la clase. , por ejemplo, para realizar un seguimiento de cuántos objetos de una clase en particular se han creado.

Lugar de almacenamiento:
aunque los miembros de datos estáticos se declaran dentro de una clase, no se consideran parte de los objetos. En consecuencia, su declaración en la clase no se considera como su definición. Un miembro de datos estáticos se define fuera de la clase. Esto significa que aunque el miembro de datos estáticos se declare en el ámbito de la clase, su definición persiste en todo el archivo. Un miembro estático tiene ámbito de archivo. Sin embargo, dado que un miembro de datos estáticos se declara dentro de la clase, solo se puede acceder a ellos mediante el nombre de la clase y el operador de resolución de alcance.

A continuación se muestra el programa para ilustrar la asignación de memoria en miembros de datos estáticos y no estáticos :

Programa 1: para ilustrar miembros no estáticos

// C++ program to illustrate
// non-static data members
using namespace std;
#include <iostream>
  
// Class
class GfG {
private:
    // Created a variable
    int count = 0;
  
public:
    // Member function to increment
    // value of count
    void set_count()
    {
        count++;
    }
  
    // Member function to access the
    // private members of this class
    void show_count()
    {
  
        // print the count variable
        cout << count << '\n';
    }
};
  
// Driver Code
int main()
{
    // Objects of class GfG
    GfG S1, S2, S3;
  
    // Set count variable to 1
    // for each object
    S1.set_count();
    S2.set_count();
    S3.set_count();
  
    // Function to display count
    // for each object
    S1.show_count();
    S2.show_count();
    S3.show_count();
  
    return 0;
}
Producción:

1
1
1

A continuación se muestra la ilustración de la asignación de memoria para el programa anterior:

Explicación:
los tres objetos de la clase GfG S1, S2 y S3 comparten las funciones de miembro pero tienen una copia separada del recuento de miembros de datos. En main() , se llama explícitamente a set_count() para establecer el valor de count en 1. Ahora, cada objeto tiene el valor de su cuenta = 1.

Programa 2: para ilustrar miembros estáticos:

// C++ program to illustrate
// non-static data members
using namespace std;
#include <iostream>
  
// Class
class GfG {
private:
    // Created a static variable
    static int count;
  
public:
    // Member function to increment
    // value of count
    void set_count()
    {
        count++;
    }
  
    // Member function to access the
    // private members of this class
    void show_count()
    {
  
        // print the count variable
        cout << count << '\n';
    }
};
  
int GfG::count = 0;
  
// Driver Code
int main()
{
    // Objects of class GfG
    GfG S1, S2, S3;
  
    // Increment count variable
    // by 1 for each object
    S1.set_count();
    S2.set_count();
    S3.set_count();
  
    // Function to display count
    // for each object
    S1.show_count();
    S2.show_count();
    S3.show_count();
  
    return 0;
}
Producción:

3
3
3

A continuación se muestra la ilustración de la asignación de memoria para el programa anterior:

Explicación:
Los tres objetos de la clase GfG S1, S2 y S3 comparten las funciones de miembro, así como el miembro de datos estáticos. Solo existe una copia del miembro de datos estáticos en la memoria. No es necesario que una función establezca explícitamente el valor de recuento porque el valor de los miembros de datos estáticos se ha inicializado en 0 fuera de la definición de clase. Ahora, cada objeto incrementa el valor de conteo y, por lo tanto, la salida.
Nota: La memoria para funciones miembro y miembros de datos estáticos se asigna por clase y no por objeto. La clase muestra no tiene miembro de datos (excepto el recuento estático), pero esto no significa que no se asignará espacio de memoria a los objetos de Muestra. En tales casos, la memoria mínima se reserva para el objeto. Por lo tanto, el tamaño de S1, S2 y S3 es de 1 byte.

Publicación traducida automáticamente

Artículo escrito por aryadasburma y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *