2012-08-16 12 views
7

Decir que tengo esta clase:¿Los constructores predeterminados se llaman automáticamente para las variables de miembro?

//Awesome.h 
class Awesome 
{ 
    public: 
     Awesome(); 
    private: 
     membertype member; 
} 

//Awesome.cpp 
#include "Awesome.h" 

Awesome::Awesome() 
:member() 
{ 
} 

Si Omito la member() en la lista de inicialización del constructor de Awesome, a la constructora de member automáticamente su llamada? ¿Y solo se llama cuando no incluyo member en la lista de inicialización?

+0

posible duplicado de [¿Cuál es el valor predeterminado para los miembros de la clase de C++] (http://stackoverflow.com/questions/2614809/what-is-the-default-value-for-c-class-members) – FailedDev

+0

depende de 'membertype' pero generalmente sí. – AJG85

Respuesta

7

De § 8,5

Si no se especifica un inicializador para un objeto, el objeto es default-inicializado; si no se realiza la inicialización, un objeto con duración de almacenamiento automático o dinámico tiene un valor indeterminado. [Nota: objetos con duración de almacenamiento estático o de subprocesos con inicialización cero, ver 3.6.2. nota -fin]

Actualización para referencias futuras: aún más el significado de incumplimiento inicializado se define como

Para default-inicializar un objeto de tipo T significa:
-si T es una (posiblemente cv-calificado) tipo de clase (Cláusula 9), se llama al constructor predeterminado para T (y la inicialización está mal formada si T no tiene constructor por defecto accesible);
- si T es un tipo de matriz, cada elemento se inicializa por defecto;
- de lo contrario, no se realiza ninguna inicialización .
Si un programa solicita la inicialización predeterminada de , un objeto de un tipo con const-calificado T, T será un tipo de clase con un constructor predeterminado proporcionado por el usuario .

Además varía de valor inicializado refiriéndose esto: -

Para valor-inicializar un objeto de tipo T significa:
- si T es un tipo de clase (posiblemente cv-cualificada) (Cláusula 9) con un constructor proporcionado por el usuario (12.1), entonces se llama al constructor predeterminado para T (y la inicialización está mal formada si T no tiene un constructor por defecto accesible );
- si T es un tipo de clase no sindicalizada (posiblemente cv calificado) sin un constructor proporcionado por el usuario, entonces el objeto es con cero inicialización y, si el constructor predeterminado implícitamente T no es trivial, ese constructor se llama.
- si T es un tipo de matriz , entonces cada elemento tiene inicialización de valor;
- de lo contrario, el objeto tiene cero inicialización.

13

Sí. Cuando una variable no se da en la lista de iniciación, entonces se construye automáticamente por defecto.

contrucción defecto medios, que si membertype es una class o struct, entonces será por defecto contructed, si se trata de un conjunto integrado, a continuación, cada elemento será por defecto construida y si se trata de una acumulación en el tipo, luego no se realizará la inicialización (a menos que el objeto Awesome tenga una duración de almacenamiento estática o de subproceso local). El último caso significa que la variable miembro puede (y a menudo lo hará) contener basura impredecible en caso de que el objeto Awesome se cree en la pila o se asigne en el montón.

Cuestiones relacionadas