2011-11-25 8 views
12

En C y C++ todas las variables estáticas se inicializan de forma predeterminada en CERO.¿Por qué debería inicializar las variables de clase estáticas en C++?

Este no es el caso de los miembros de datos de clase estáticos. ¿Porqué es eso?

#include <iostream> 
using namespace std; 

int var; 

class MyClass 
{ 
public: 
    static int classVar; 
}; 
int MyClass::classVar = 0; // Why I have to init it here? 

int main(void) 
{ 
    cout << ::var << endl;   // this is initalized to ZERO by default 
    static int var; 
    cout << var << endl;   // and this also is initalized to Zero 
    cout << MyClass::classVar << endl; 

    return 0; 
} 
+0

No está seguro de que ** var ** esté inicializado en 0. Es posible, a veces probable, pero no estoy seguro. –

+3

@AlessandroPezzato: en realidad, el estándar es explícito sobre la puesta a cero de la memoria de todas las variables globales antes de ejecutar la inicialización dinámica ... aparte de las integradas a las que afecta un valor literal, las que creo pueden verse afectadas directamente (bajo como-si regla) ya que es inobservable. –

Respuesta

21

En ámbito de clase,

int MyClass::classVar = 0; // Why I have to init it here? 

es una definición y

static int classVar; 

es una declaración , es decir. una promesa de que la variable será definida en alguna parte: debe definir exactamente una vez las variables que declara.

La razón es que la declaración de clase probablemente se incluirá en varios archivos de origen. Si una parte de ella fuera una definición, tendría lugar multiplicar: esto es erróneo (las excepciones son funciones en línea [miembros]).

Tenga en cuenta que de acuerdo a las reglas valor de inicialización, puede llevarse bien con

int MyClass::classVar; // Zero-initialized ! 

como una definición.

Las variables declaradas en el ámbito del espacio de nombres son definiciones también (a menos que sean extern cualificada):

int var; 

es una declaración y una definición: si se pone esto en una cabecera e incluirlo en múltiples unidades de traducción, tiene un error ("símbolo definido de forma múltiple", o algo parecido).

[Nótese que en C++ (y no en C), si el anterior es varconst, se convierte automáticamente static y no hay violación de la Regla Una definición que debe ser puesto en una cabecera multiplican incluido. Esto va un poco fuera de tema, pero no dude en preguntar detalles]

+2

No estoy seguro de que sea eso lo que se está preguntando. Lo leí como "¿por qué tengo que poner' = 0; 'allí?" – Mat

+0

@Alexandre C .: Sería bueno si también explicas por qué es necesario. – Nawaz

+3

Entonces, 'int MyClass :: classVar;' ya debería ser suficiente si solo requiere inicialización a cero? Nunca lo intenté, pero según Std y una respuesta eliminada, realmente lo hace. – zerm

2

Tiene que inicializar sus variables de datos estáticos de clase, porque tiene que decirle al compilador cuál es su valor. Las clases no necesitan tener una noción de un valor predeterminado.

tipos variables tienen un lógico "valor cero", por int es 0, por double 0,0, para un string "" etc. En contraste, las clases no necesariamente tienen un valor por defecto. Considere, por ejemplo, class Rectangle. ¿Cuál es su valor cero: un rectángulo con un cuadrado cero o un rectángulo con la longitud del lado de la unidad?Para las variables estáticas, un compilador le pide que se defina a sí mismo, qué valor debe tener su variable estática, porque no todos los tipos de datos pueden inicializarse con un valor predeterminado.

+1

Creo te equivocas aquí: nada te impide definir una variable estática y no inicializarla. Si la variable es una instancia de una clase, entonces se llamará a su constructor. – qdii

+0

Se debe definir la variable estática. Constructor no la inicializará. Considere el siguiente ejemplo ... Si se va a comentar "int test :: k;" no se compilará. clase test { public: static int k; }; int test :: k; int main() { test t; cout << t.k; return 0; } – rakesh

+0

@victor Sí, tienes razón, gracias por notarme eso. La pregunta era sobre definir una variable estática, y no su inicialización. –

Cuestiones relacionadas