Espacios de nombres
Variantes
Acciones

Inicialización cero

De cppreference.com
< cpp‎ | language

Establece el valor inicial de un objeto a cero.

Contenido

[editar] Sintaxis

static T objeto ; (1)
T () ;

T t = {} ;
T {} ;

(2)

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

[editar] 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.

[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

[editar] Véase también