2008-12-10 17 views

Respuesta

90

En C++, un objeto se considera completamente inicializado cuando la ejecución ingresa al cuerpo del constructor.

Dijiste:

"Yo quería saber por qué const debe ser inicializado en inicializador de constructor lista en lugar de en ella del cuerpo?".

Lo que se echa en falta es que inicialización sucede en la lista de inicialización y asignación sucede en el cuerpo del constructor. Los pasos en lógica:

1) Un objeto const solo se puede inicializar.

2) Un objeto tiene todos sus miembros inicializados en la lista de inicialización. Incluso si no los inicializa explícitamente allí, el compilador lo hará felizmente para usted :-)

3) Por lo tanto, colocando 1) y 2) juntos, un miembro que es const solo puede tener un valor asignado a en la inicialización, que ocurre durante la lista de inicialización.

+3

Felicitaciones por su primera respuesta ...^_^ – paercebal

+1

Acerca de no.2. ASFAIK esto es cierto solo para tipos no integrados con ctors predeterminados. Yo diría que no.1 junto con lo que usted indicó anteriormente la lista es suficiente para responder la pregunta. De todos modos, buena respuesta +1 de mí! –

+1

@AndreasMagnusson: antes de C++ 11, la inicialización predeterminada se realiza para todos los miembros no nombrados en la lista de inicializadores, incluidos los tipos primitivos incorporados (para lo cual la inicialización predeterminada significa "sin inicialización en absoluto"). Si no hay un constructor predeterminado (accesible), entonces es un error de compilación. Luego, los inicializadores de llave o igual cambiaron todo esto. –

9

const y las variables de referencia se deben inicializar en la línea que se declaran.

class Something 
{ 
    private: 
     const int m_nValue; 
    public: 
     Something() 
     { 
      m_nValue = 5; 
     } 
    }; 

produciría un código equivalente a;

const int nValue; // error, const vars must be assigned values immediately 
nValue = 5; 

La asignación de const o valores de variables de miembro de referencia en el cuerpo del constructor no es suficiente.

C++ proporciona otra forma de inicializar las variables miembro que permite inicializar las variables miembro cuando se crean en lugar de después. Esto se hace mediante el uso de una lista de inicialización.

Puede asignar valores a las variables de dos maneras: explícita e implícitamente: ver plaincopy a clipboardprint?

int nValue = 5; // explicit assignment 
double dValue(4.7); // implicit assignment 

Usar una lista de inicialización es muy similar a realizar asignaciones implícitas.

Recuerde que la lista de inicialización de miembros, utilizada para inicializar objetos de datos base y miembros, está en la definición, no en la declaración del constructor.

Más sobre cpp-tutorial y Code Wrangler.

-2

Porque las variables constantes y las referencias deben inicializarse en el momento de la declaración, es decir, antes de su uso. Pero los constructores asignarán valor a una variable no invalidante de la variable, por lo tanto, debe usar la lista de initabilidad para la constante y referencias

Cuestiones relacionadas