Inicialización cero
Establece el valor inicial de un objeto a cero.
Contenido |
[editar] Sintaxis
static T objeto ;
|
(1) | ||||||||
T () ;
T t |
(2) | (desde C++11) | |||||||
CharT array [ n ] = "";
|
(3) | ||||||||
[editar] Explicación
La inicialización cero se realiza en las siguientes situaciones:
Los efectos de la inicialización cero son:
- Si
T
es un tipo escalar, el valor inicial del objeto es la constante entera cero explícitamente convertida aT
.
- Si
T
es un tipo clase no-unión, todas las clases base y datos miembro no estáticos son inicializados a cero, y todo el relleno se inicializa con bits cero. Los constructores, si es que los hay, se ignoran.
- Si
T
es un tipo unión, el primer dato miembro no estático con nombre se inicializa a cero y todo el relleno se inicializa con bits cero.
- Si
T
es un tipo array, cada elemento se inicializa a cero.
- Si
T
es un tipo referencia, no se hace nada.
[editar] Notas
Como se describe en la inicialización no local, las variables estáticas y locales al hilo que no son inicializadas con una constante (desde C++14) se inicializan a cero antes que tome lugar alguna otra inicialización. Si la definición de una variable de no clase o variable no local no tiene un inicializador, entonces la inicialización por defecto no hace nada, dejando el resultado de la inicialización cero anterior sin modificar.
Un puntero inicializado a cero es el valor del puntero nulo de su tipo, aún si el valor del puntero nulo no es un cero entero.
[editar] Ejemplo
#include <string> double f[3]; // inicialización cero a tres 0.0's int* p; // inicialización cero al valor del puntero nulo std::string s; // inicialización cero a un valor indeterminado, // luego inicializado por defecto a "" int main(int argc, char* argv[]) { static int n = argc; // inicialización cero a 0 // luego inicialización de copia a argc delete p; // es seguro eliminar un puntero nulo }
[editar] Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
CWG 2026 | C++14 | estaba especificado que la inicialización cero siempre ocurre primero, inclusive antes que la inicialización por constante |
no hay inicialización cero si se aplica la inicialización por constante |