2011-04-10 10 views
13

Duplicar posible:
What do the following phrases mean in C++: zero-, default- and value-initialization?Diferencia entre default-initialize e value-initialize?

estaba leyendo this answer, por lo que me encontré con la segunda palabra: value-initialize. Inicialmente pensé que esto es lo mismo que default-initialize pero el contexto me insinúa que estoy equivocado.

Así que mi pregunta es:

¿Cuál es la diferencia entre default-inicializar y valor inicializar?

Me gustaría entender la diferencia con algunos ejemplos.

+0

duplicado posible de [? ¿Qué significan las siguientes frases en C++: cero, default- y el valor de inicialización] (http://stackoverflow.com/ questions/1613341/what-do-the-following-phrases-mean-in-c-zero-default-and-value-initializati) – Xeo

+0

@Xeo: gracias por el duplicado ... He votado a favor de cerrar este tema. – Nawaz

Respuesta

9

De acuerdo con el estándar (8,5/4,5):

Para default-inicializar un objeto de tipo T significa:
- si T es un no-POD tipo de clase de la se llama al constructor predeterminado para T (y la inicialización es mal formada si T no tiene acceso al constructor predeterminado accesible);
- si T es un tipo de matriz , cada elemento es inicializado por defecto;
- de lo contrario, el objeto tiene cero inicialización.


Para valor-inicializar un objeto de tipo T significa:
- si T es un tipo de clase (cláusula 9) con un constructor-declarado de usuario (12 .1), se llama al constructor predeterminado para T (y la inicialización está mal formada si T tiene ningún constructor predeterminado accesible);
- si T es un tipo de clase no unión sin un constructor-declarado usuario, entonces cada componente de la clase base miembro de datos no estático y de T es valor inicializado; 96)
- si T es un tipo de matriz , cada elemento es value-initialized;
- de lo contrario, el objeto se -inicializado a cero

+0

Advertencia: Esta respuesta no está actualizada para C++ 11. Ver http://stackoverflow.com/q/22233148/368896. En C++ 11, para el caso 'default-initialize', el' - de lo contrario, el objeto se inicializa en cero' se reemplaza por '- de lo contrario, no se realiza la inicialización'. –

7

"inicialización-por defecto" le da el valor predeterminado según lo especificado por el estándar, que podría ser basura.

"valor-inicialización" lo inicializa en un valor específico, uno establecido en el constructor, por ejemplo, u optimizado por el compilador.

+0

Esto me ayuda a recordar que cuando 'valor' inicializa algo, lo que realmente hace es establecer sus VALORES (incluso si eso significa establecerlos en 0 como una falla si no hay un constructor disponible), mientras que la inicialización simple' predeterminada' no tendrá ninguna caída y los valores pueden inicializarse si ningún constructor establece su valor. En el espíritu de C++, debe haber alguna condición para forzar la inicialización de 'valor', es decir, debe pasar explícitamente paréntesis, como en' A a(); '(vea http://stackoverflow.com/a/8860787/ 368896). –

+0

@Dan Nissenbaum No es A a(); ¿Un problema analizador molesto? ¿Visto como una declaración de función? – Zebrafish

+0

@TitoneMaurice Tienes razón, gracias por captar eso. A * a = nuevo A(); es más como eso. –

Cuestiones relacionadas