Miembros de datos estáticos en C++

Los miembros de datos estáticos son miembros de clase que se declaran mediante palabras clave estáticas. Un miembro estático tiene ciertas características especiales. Estos son:

  • Solo se crea una copia de ese miembro para toda la clase y todos los objetos de esa clase la comparten, sin importar cuántos objetos se creen.
  • Se inicializa antes de que se cree cualquier objeto de esta clase, incluso antes de que se inicie main.
  • Es visible solo dentro de la clase, pero su tiempo de vida es el programa completo

Sintaxis

static data_type data_member_name;

C++

#include <iostream>
using namespace std;
 
class A
{
public:
    A() { cout << "A's Constructor Called " << endl;  }
};
 
class B
{
    static A a;
public:
    B() { cout << "B's Constructor Called " << endl; }
};
 
int main()
{
    B b;
    return 0;
}

Producción: 

B's Constructor Called

El programa anterior llama solo al constructor de B, no llama al constructor de A. La razón de esto es simple, los miembros estáticos solo se declaran en una declaración de clase, no se definen. Deben definirse explícitamente fuera de la clase mediante el operador de resolución de ámbito
Si intentamos acceder al miembro estático ‘a’ sin una definición explícita del mismo, obtendremos un error de compilación. Por ejemplo, el siguiente programa falla en la compilación.

C++

#include <iostream>
using namespace std;
 
class A
{
    int x;
public:
    A() { cout << "A's constructor called " << endl;  }
};
 
class B
{
    static A a;
public:
    B() { cout << "B's constructor called " << endl; }
    static A getA() { return a; }
};
 
int main()
{
    B b;
    A a = b.getA();
    return 0;
}

Producción: 

Compiler Error: undefined reference to `B::a' 

Si agregamos la definición de a, el programa funcionará bien y llamará al constructor de A. Ver el siguiente programa.

C++

#include <iostream>
using namespace std;
 
class A
{
    int x;
public:
    A() { cout << "A's constructor called " << endl;  }
};
 
class B
{
    static A a;
public:
    B() { cout << "B's constructor called " << endl; }
    static A getA() { return a; }
};
 
A B::a;  // definition of a
 
int main()
{
    B b1, b2, b3;
    A a = b1.getA();
 
    return 0;
}

Producción: 

A's constructor called
B's constructor called
B's constructor called
B's constructor called

Tenga en cuenta que el programa anterior llama al constructor de B 3 veces para 3 objetos (b1, b2 y b3), pero llama al constructor de A solo una vez. El motivo es que los miembros estáticos se comparten entre todos los objetos. Por eso también se les conoce como miembros de clase o campos de clase . Además, se puede acceder a los miembros estáticos sin ningún objeto , consulte el siguiente programa donde se accede al miembro estático ‘a’ sin ningún objeto.

C++

#include <iostream>
using namespace std;
 
class A
{
    int x;
public:
    A() { cout << "A's constructor called " << endl;  }
};
 
class B
{
    static A a;
public:
    B() { cout << "B's constructor called " << endl; }
    static A getA() { return a; }
};
 
A B::a;  // definition of a
 
int main()
{
    // static member 'a' is accessed without any object of B
    A a = B::getA();
 
    return 0;
}

Producción: 

A's constructor called

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *