¿A qué se inicializan por defecto los tipos primitivos en C ++?

Cuando uso una lista de inicialización:

struct Struct { Struct() : memberVariable() {} int memberVariable; }; 

la variable de miembro de tipo primitivo ( int , bool , float , enum , puntero) se inicializa por defecto . ¿El valor que se obtiene es la implementación definida o es el mismo para todas las implementaciones?

Usted no es correcto El objeto no está inicializado por defecto sino inicializado por valor . Y su valor está bien definido

 int = 0, bool = false, float = 0.0f, enum = (enum type)0, pointer = null pointer pointer to member = null member pointer 

Tenga en cuenta que cero está en el rango de valores para cualquier enumeración, incluso si no contiene un enumerador explícito con ese valor, por lo que es seguro inicializar una variable de enumeración a ese valor.

En particular, para el puntero a los miembros de los datos, la representación utilizada en la práctica no es bits totalmente cero. En el llamado C ++ Itanium ABI utilizado por al menos GCC y Clang, el puntero a los miembros de datos tiene una representación nula de todos los bits.

El estándar dice ( 8.5/5 )

Para inicializar por defecto un objeto de tipo T significa:

– si T es un tipo de clase no POD (cláusula 9), 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 matriz, cada elemento se inicializa por defecto;

– de lo contrario, el objeto tiene cero inicialización .

.

Valorizar-inicializar un objeto de tipo T significa:

– si T es un tipo de clase (cláusula 9) con un constructor declarado 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 sindical sin un constructor declarado por el usuario, entonces cada componente de datos no estáticos y de clase base de T tiene un valor inicializado;

– si T es un tipo de matriz, entonces cada elemento tiene un valor inicializado;

– de lo contrario, el objeto tiene cero inicialización

.

¿El valor que se obtiene es la implementación definida o es el mismo para todas las implementaciones?

Entonces el valor sería el mismo para todas las implementaciones.

Struct es un tipo que no es POD, por lo

  Struct *a =new Struct; // default initialization //memberVariable will be initialized to 0 because if T is a non-POD class type //the default constructor for T is called Struct *b = new Struct(); //value initializes Struct, which calls the default ctor. //memberVariable will be initialized to 0 in this case also. 

EDITAR :

Como @Johannes notó que la variable de miembro del tipo primitivo (int, bool, float, enum, pointer) tiene un value-initialized no default initialized .

Para los tipos primitivos, la inicialización predeterminada significa que el objeto se inicializa con 0, 0.0 o NULL según corresponda para el tipo.

Editar: Lo anterior es válido para C ++ 98. En C ++ 03, los términos se redefinieron un poco. Ahora, usar un inicializador de () (que sintácticamente solo es posible para los objetos miembros) da como resultado la inicialización del valor , que para los tipos primitivos significa que se almacena el valor apropiado de 0, 0.0 o NULL.

0

Si llama a () en una primitiva, el efecto es el mismo que asignar el valor predeterminado que se le hubiera dado si hubiera sido estático.

Depende de cómo instancias una clase, si usas ClassName (), las clases POD se inicializan por defecto a cero para la clase no POD se llama al constructor predeterminado, pero si usas ClassName, sin los paréntesis no se produce la inicialización predeterminada.

Los tipos nativos como int generalmente obtienen un garbage value , por ej. cualquier cosa que resida en el área de memoria en la que se crea. Sin embargo, esto no está definido en el estándar, y también podría inicializarse a 0, que es bastante común en, por ejemplo. construcciones de depuración.

EDITAR. Pero básicamente, nunca debes confiar en una variable no inicializada para contener algo específico; Defina siempre los valores usted mismo.