¿Por qué se necesitan miembros de datos estáticos de C ++ para definir pero los miembros de datos no estáticos no?
Estoy tratando de entender la diferencia entre la declaración y definición de miembros de datos estáticos y no estáticos. Disculpas si no entiendo los conceptos fundamentalmente. Se agradecen mucho sus explicaciones.
Código que estoy tratando de entender
class A
{
public:
int ns; // declara miembro de datos no estático.
static int s; // declara miembro de datos estático.
void foo();
};
int A::s; // define miembro de datos no estático.
// int A::ns; //Esto da un error si se define.
void A::foo()
{
ns = 10;
s = 5; // si s no está definido, esto da un error de "referencia indefinida"
}
davy.ai
Explicación
Declaración
En C++, la declaración de una variable o función significa proporcionar información al compilador acerca de su existencia y uso adecuado, incluyendo su nombre, tipo de datos y control de acceso. En el código anterior, las siguientes son declaraciones:
int ns;
— Esta es la declaración de un miembro de datos no estático de la claseA
con el nombrens
.static int s;
— Esta es la declaración de un miembro de datos estático de la claseA
con el nombres
.Definición
En C++, la definición significa asignar espacio de almacenamiento y establecer el valor inicial para una variable o función declarada. En otras palabras, definir un objeto significa decirle al compilador dónde y cuánta memoria asignar para él. En el código anterior, las siguientes son definiciones:
int A::s;
— Esto define el miembro de datos estáticos
de la claseA
. Asigna la memoria paras
y lo inicializa en cero.void A::foo()
— Esto define la función miembrofoo()
de la claseA
. Asigna memoria para la función y proporciona su implementación.Miembros de datos estáticos vs no estáticos
Los miembros de datos estáticos son variables de clase que son compartidas por todos los objetos de la clase. Existirán incluso si no se ha creado ningún objeto de la clase. Los miembros de datos no estáticos son variables de instancia que pertenecen a cada objeto de la clase. Solo existen cuando se crea un objeto de la clase.
La diferencia principal entre la declaración y definición de miembros de datos estáticos y no estáticos es cuándo se asigna la memoria para ellos.
Para un miembro de datos estático, su declaración también actúa como una definición, pero la memoria para él se asigna solo una vez cuando se define fuera de la clase. Es por eso que en el código anterior, tenemos
int A::s;
fuera de la clase para definir la memoria del miembro de datos estáticos
.Para un miembro de datos no estático, su declaración solo informa al compilador acerca de su existencia y tipo. La memoria se asigna para él cuando se crea un objeto de la clase. Por lo tanto, definir un miembro de datos no estático fuera de la clase dará como resultado un error, porque no hay memoria para asignar hasta que se cree un objeto.
Espero que esto le brinde una comprensión clara de la declaración y definición de miembros de datos estáticos y no estáticos en C++.