Inicialización cero
Establece el valor inicial de un objeto a cero.
Sintaxis
static T objeto ;
|
(1) | ||||||||
T () ;
T t |
(2) | (desde C++11) | |||||||
CharT array [ n ] = "";
|
(3) | ||||||||
Explicación
La inicialización cero se realiza en las siguientes situaciones:
Los efectos de la inicialización cero son:
- Si
Tes un tipo escalar, el valor inicial del objeto es la constante entera cero explícitamente convertida aT.
- Si
Tes 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
Tes 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
Tes un tipo array, cada elemento se inicializa a cero.
- Si
Tes un tipo referencia, no se hace nada.
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.
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
}
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 |