programacion - ¿A qué se inicializan por defecto los tipos primitivos en C++?
tipos de datos primitivos en programacion (6)
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.
Cuando uso una lista de inicialización:
struct Struct {
Struct() : memberVariable() {}
int memberVariable;
};
la variable miembro de tipo primitivo ( int
, bool
, float
, enum
, puntero) está inicializada por defecto . ¿El valor que se obtiene es la implementación definida o es el mismo para todas las implementaciones?
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 está inicializado por defecto;
- de lo contrario, el objeto tiene cero inicialización .
.
Para inicializar con valor 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 sin unión sin un constructor declarado por el usuario, entonces cada miembro de datos no estáticos y componente de clase base de T se inicializa con valores;
- 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 igual 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
.
Los tipos nativos como int usualmente obtienen un garbage value
, por ejemplo. 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.
Para los tipos primitivos, la inicialización predeterminada significa que el objeto se inicializa con 0, 0.0 o NULL según sea apropiado 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.
Usted no es correcto El objeto no está inicializado por defecto sino que se inicializa 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 ABI de C ++ Itanium utilizado por al menos GCC y Clang, los punteros a los miembros de datos tienen una representación nula de bits todo en uno.
0
Si llama a ()
en una primitiva, el efecto es el mismo que asignarle el valor predeterminado que se habría dado si hubiera sido estático.