Inicialización cero
Establece el valor inicial de un objeto a cero.
Contenido |
[editar]Sintaxis
static Tobjeto; | (1) | ||||||||
T() ; Tt | (2) | (desde C++11) | |||||||
CharTarray[ 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'sint* p;// inicialización cero al valor del puntero nulostd::string s;// inicialización cero a un valor indeterminado,// luego inicializado por defecto a ""int main(int argc, char* argv[]){staticint 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 |