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

staticTobjeto; (1)
T();

Tt={};
T{};

(2)

(desde C++11)
CharTarray[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'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

[editar]Véase también

close