Definición de miembros estáticos en C ++

Estoy tratando de definir una variable pública estática como esta:

public : static int j=0; //or any other value too 

Estoy obteniendo un error de comstackción en esta misma línea: ISO C ++ prohíbe la inicialización en clase del miembro estático no-const `j ‘.

  1. ¿Por qué no está permitido en C ++?

  2. ¿Por qué se permite inicializar a los miembros de const?

  3. ¿Esto significa que las variables estáticas en C ++ no se inicializan con 0 como en C?

Gracias !

(1.) ¿Por qué no está permitido en C ++?

De Bjarne Stroustrup Preguntas frecuentes sobre el estilo y la técnica C ++ : A class is typically declared in a header file and a header file is typically included into many translation units. However, to avoid complicated linker rules, C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities that needed to be stored in memory as objects. A class is typically declared in a header file and a header file is typically included into many translation units. However, to avoid complicated linker rules, C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities that needed to be stored in memory as objects.

(2.) ¿Por qué se pueden inicializar los miembros de const?

[ dirkgently lo dijo mejor ]

(3.) ¿Significa esto que las variables estáticas en C ++ no se inicializan con 0 como en C?

Por lo que yo sé, siempre y cuando declare el miembro estático var en .cpp, se inicializará en cero si no especifica lo contrario:

 // in some .cpp int Test::j; // j = int(); 

Tendrá que inicializar la variable estática en un archivo .cpp y no en la statement de clase.

Cuando declaras una variable estática en la clase, puede usarse sin instanciar una clase.

 //Header file class Test { public: static int j; }; //In cpp file //Initialize static variables here. int Test::j = 0; //Constructor Test::Test(void) { //Class initialize code } 

¿Por qué no está permitido en C ++?

Hasta que, a menos que lo defina, la variable no se convierta en un valor l.

¿Por qué se permite inicializar a los miembros de const?

Incluso en este caso, se requiere una definición si va a tomar la dirección de la variable.

9.4.2 Miembros de datos estáticos

2 La statement de un miembro de datos estáticos en su definición de clase no es una definición y puede ser de un tipo incompleto distinto de un vacío calificado por cv. La definición de un miembro de datos estáticos debe aparecer en un ámbito de espacio de nombres que incluya la definición de clase del miembro. En la definición en el ámbito del espacio de nombres, el nombre del miembro de datos estáticos debe calificarse por su nombre de clase utilizando el operador ::. La expresión del inicializador en la definición de un miembro de datos estáticos está en el scope de su clase

Además, esto es principalmente un artefacto de uso para que pueda escribir:

 class S { static const int size = 42; float array[ size ]; }; 

¿Esto significa que las variables estáticas en C ++ no se inicializan con 0 como en C?

No son:

3.6.2 Inicialización de variables no locales

Las variables con duración de almacenamiento estático (3.7.1) o duración de almacenamiento de subprocesos (3.7.2) deben ceroinicializarse (8.5) antes de que se lleve a cabo cualquier otra inicialización.

Aunque las cosas se vuelven un poco más complicadas en C ++ 0x. Ahora se pueden inicializar todos los tipos literales (a diferencia de solo los tipos integrales en el estándar actual) lo que significa que todos los tipos escalares (flotantes incluidos) y algunos tipos de clase ahora se pueden inicializar usando un inicializador en la statement.

La respuesta corta:

Es equivalente a decir extern int Test_j = 0; .

Si comstackra, ¿qué pasaría? Cada archivo fuente, incluido el archivo de encabezado de su clase, definiría un símbolo llamado Test :: j inicializado a 0. El enlazador tiende a no gustarle.

 class GetData { private: static int integer; //Static variable must be defined with the extension of keyword static; public: static void enter(int x) { integer = x; //static variable passed through the static function } static int show() //declared and defined { return integer; //will return the integer's value } }; int GetData::integer = 0; //Definition of the static variable int main() { GetData::enter(234); //value has been passed through the static function enter. Note that class containing static variables may not have the object in main. They can be called by scope resolution operator in main. cout<