2012-01-14 9 views
10

Duplicar posible:
What do the following phrases mean in C++: zero-, default- and value-initialization?¿Qué significa 'valorizar inicializar' algo?

Si tengo una clase, por ejemplo:

class Info 
{ 
    int x; 
    int y; 
}; 

que he usado para crear un objeto,

Info *p = new Info(); 

¿Significa que los paréntesis que están al lado de Información significan que lo estoy inicializando? ¿Cómo se diferencia de esto, Info *p = new Info;?

Sé que hay un question que diferencia entre los diferentes significados en el nuevo y antiguo lenguaje C++, pero quiero saber la diferencia semántica entre la inicialización predeterminada y la de valor, p. ¿Inicializar el valor significa inicializar algo a cero?

+0

posible duplicado de [¿Qué significan las siguientes frases en C++: cero-, por defecto- y la inicialización de valor?] (Http://stackoverflow.com/questions/1613341 /), [¿Diferencia entre default-initialize e value-initialize en C++ 03?] (Http://stackoverflow.com/questions/7084831/). – outis

Respuesta

19

Una variable puede ser declarado inicializados a cero, valor inicializado o defecto ya iniciada.

En su ejemplo:

Info *p = new Info(); <------- Value Initialization 
Info *p = new Info;  <------- Default Initialization 

El C++ 03 Standard 8,5/5 define acertadamente cada uno:

Para cero inicializar un objeto de tipo T significa:

- si T es un tipo escalar (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.

Para default-inicializar un objeto de tipo T significa:
- si T es a-POD no tipo de clase (cláusula 9), el constructor predeterminado de T se llama (y está formado malos la inicialización si T no tiene un constructor por defecto accesible);
- si T es un tipo de matriz, cada elemento se inicializa por defecto;
- de lo contrario, el objeto se inicializa en cero.

Para valor-inicializar un objeto de tipo T significa:
- si T es un tipo de clase (cláusula 9) con un constructor (12-declarado usuario.1), entonces se llama al constructor predeterminado para T (y la inicialización está mal formada si T no tiene acceso al constructor predeterminado );
- 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 lo contrario, el objeto se inicializa en cero

+0

Als - Muy buena respuesta - ¡me salvó el tipeo! –

+0

En mi caso, la clase 'Info' es tipo de clase POD. ¿Significa que la inicialización predeterminada será la inicialización cero? – user1086635

+0

@ user1086635: Sí. Se menciona claramente en el segundo párrafo de la cita estándar anterior. –

Cuestiones relacionadas