2012-04-11 16 views
7

¿El int a = int(); necesariamente me da un cero?Hace "int a = int();" necesariamente darme un cero?

¿Qué tal si int se sustituye por char, double, bool o tipo puntero?

¿Dónde se especifica esto en el estándar de idioma, por favor?

+0

posible duplicado de [? Hacer constructores por defecto incorporados tipos tienen] (http : //stackoverflow.com/questions/5113365/do-built-in-types-have-default-constructors) – Kaz

Respuesta

17

¿El int a = int(); necesariamente me da un cero?

Sí, la norma garantiza que le da cero.
Esto se conoce como Value Initialization. Para el tipo int, Inicialización de valor básicamente termina siendo cero inicialización .

¿Dónde se especifica esto en el estándar de idioma, por favor?

Las reglas están claramente especificadas en el estándar en sección 8.5. citaré los relevantes a la Q aquí:

C++ 03: 8.5 Inicializadores
Apartado 7:

Un objeto cuya inicializador es un conjunto vacío de paréntesis, es decir,(), se inicializará el valor.

valor de inicialización & Zero inicialización se definen en 8.5 Para 5 como:

Para valor-inicializar un objeto de tipo T significa:

- si T es una tipo de clase (cláusula 9) con un constructor declarado por el usuario (12.1), entonces se llama al constructor predeterminado para T (y la inicialización está mal formada si T no tiene acceso constructor por defecto);
- si T es un tipo de clase no sindical sin un constructor declarado por el usuario, entonces cada miembro de datos no estático y el componente de clase base de T tiene un valor inicializado;
- si T es un tipo de matriz, entonces cada elemento tiene un valor inicializado;
- de otro modo, el objeto se cero-inicializado

Para cero inicializar un objeto de tipo T significa:

- si T es un escalar tipo (3.9), el objeto se establece en el valor de 0 (cero) convertido a T;
- si T es un tipo de clase no-unión, cada miembro de datos no estático y cada subobjeto de clase base
tiene cero inicialización;
- si T es un tipo de unión, el primer miembro de datos con nombre del objeto se inicializa en cero;
- si T es un tipo de matriz, cada elemento tiene cero inicialización;
- si T es un tipo de referencia, no se realiza ninguna inicialización.

Nota: Los textos en negrita son enfatizados por mí.

+0

Y hay otro párrafo en algún lugar donde se especifica que la inicialización del valor para 'int' significa inicializar a' 0' .. – juanchopanza

+0

@juanchopanza: Si sigues el texto en negrita en las cotizaciones estándar anteriores, verás cómo se llega a eso. –

+0

Sé que el texto no estaba allí cuando escribí el comentario. Hace poco revisé esto en C++ 11 tratando de descubrir '{}' inicialización :) – juanchopanza

0

Sí, cualquier tipo incorporado siempre se inicializa a cero cuando se inicializa por defecto. Tenga en cuenta que en la mayoría de los escenarios de un tipo incorporado es no predeterminado inicializado para que esto no necesariamente se imprima 0:

int i; 
std::cout << i << "\n";