Espacios de nombres
Variantes

Inicialización cero

De cppreference.com

Establece el valor inicial de un objeto a cero.

Sintaxis

static T objeto ; (1)
T () ;

T t = {} ;
T {} ;

(2)

(desde C++11)
CharT array [ n ] = ""; (3)

Explicación

La inicialización cero se realiza en las siguientes situaciones:

1) para cada variable con nombre con duración de almacenamiento estático o local al hilo que no está sujeta a la inicialización por constante (desde C++14), antes de cualquier otra inicialización;
2) como parte de la secuencia de la inicialización de un valor para tipos no clase y para miembros de tipos clase inicializados por valor que no tienen constructores, incluyendo la inicialización de valor de agregados para los que no se proporcionan inicializadores;
3) Cuando un array de cualquier tipo carácter se inicializa con un literal de cadena que es demasiado corto, el resto del array se inicializa a cero.

Los efectos de la inicialización cero son:

  • 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.

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

Véase también

Morty Proxy This is a proxified and sanitized view of the page, visit original site.