2010-12-01 26 views
9

Mi compilador de C++ se queja cuando intento inicializar una variable de miembro int en la definición de clase. Indica "solo los miembros de datos integrales const pueden inicializarse dentro de una clase". ¿Puede explicar la razón de esta restricción (si es posible con el ejemplo)?¿Por qué la inicialización de la variable de miembro entero (que no es const estática) no está permitida en C++?

+0

A menos que el número entero del que habla es común para todos los objetos del tipo que está definiendo, ¿qué uso tiene en una variable miembro a la que se le asigna un valor? Llamar a esa variable const estática es la forma de decirle al compilador que la variable es común a cada objeto del tipo. – vpit3833

+0

Estoy tratando de evitar la inicialización en el constructor, dando un valor predeterminado a la variable miembro. – Sulla

+1

Ver http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-class y http://stackoverflow.com/questions/ 3575580/rationale-behind-static-const-member-initialization-sintaxis para alguna buena información. – sje397

Respuesta

8

La razón es la naturaleza de "bajo nivel" de C++. Si permitiera esto, el compilador necesitaría generar un código de inicialización para todos los constructores, lo cual no es del todo claro para el desarrollador.

Después de todo, podría ser necesario inicializar miembros de clases base en la construcción de una clase derivada, incluso cuando los constructores de la clase base no se invoquen explícitamente.

Las variables integrales estáticas no necesitan una interacción al crear objetos.

+0

Como sigue siendo el mismo, el compilador simplemente puede reemplazar las constantes con sus valores. – Tomas

+0

Ver mi respuesta: static implica que no es por instancia, y como tal no está relacionado con el constructor. – EboMike

+0

Las integrales estáticas const se inicializan solo una vez, y no cada vez que se construye un objeto de esa clase. –

3

sólo estoy adivinando que está tratando de hacer esto:

class foo { 
    int m_iX = 5; 
}; 

Esto requeriría la ejecución de código en el constructor, ya que cada instancia recién creada necesitaría para inicializar esta variable. En C++, todo el código que se ejecuta durante el constructor está (afortunadamente) en el propio constructor, por lo que es inmediatamente obvio lo que conlleva la construcción de la clase. Además, dado que una clase puede tener cualquier cantidad de constructores (incluidos los constructores de copia), sería ambiguo como cuando esta inicialización debería o no tener lugar.

Usted puede hacer esto:

class foo { 
    enum { 
     CONSTANT = 8 
    }; 
}; 

Esto le permite utilizar foo::CONSTANT. Eso funciona, ya que será por clase en lugar de por instancia.

Del mismo modo, se puede hacer esto:

class foo { 
    static int sm_iX; 
}; 

en el .cpp:

int foo::sm_ix = 5; 

Una vez más, esto es por clase, no por instancia, y como tal no es relevante para la construcción de una instancia real.

Bonificación: si declara este int const, muchos compiladores podrían evaluarlo en tiempo de compilación.

0

Arun,

Creo que su pregunta está relacionada con
Compiler Error C2864

para lograr lo que quiere hacer, C++ requiere inicializar miembros específicos de instancia (es decir: no estática no costo,), ya sea en el constructor cuerpo o la lista de inicialización. existe

4

La restricción estática porque C++ utiliza inicializadores constructor para inicializar los miembros de datos no estáticos:

struct Example { 
    int n; 
    Example() : n(42) {} 
}; 

existe La restricción const porque el caso const se trata especialmente (en lugar de al revés) para que estático Los miembros integrales de const generalmente se pueden tratar como si tuvieran un enlace interno, similar a las variables const en el ámbito del espacio de nombres (C++ 03 §7.1.5.1p2, si está interesado). Esto es principalmente beneficioso para usar los miembros en expresiones constantes integrales, como tamaños de matriz.

11

Porque no está permitido en el estándar actual. According to Bjarne, podrá hacer esto en C++ 0x. Si realmente lo necesita, intente configurar el compilador en C++ 0x (-std=c++0x en GCC) y vea si su compilador lo admite.

Cuestiones relacionadas