2009-10-03 13 views
6

Duplicar posible:
Is there a difference in C++ between copy initialization and assignment initialization?¿Cuál es la diferencia entre int x = 1 e int x (1) en C++?

Soy nuevo en C++, rara vez veo personas que utilizan esta sintaxis para declarar e inicializar una variable:

int x(1); 

lo intentara, el compilador no se quejó y el resultado es el mismo que int x = 1, ¿son realmente lo mismo?

Muchas gracias a todos ustedes.

+2

Dupe: http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-bet-copy-initialization-and-assignment-initializ –

+0

No es exactamente lo mismo. Esta pregunta parece ser específicamente sobre la inicialización de POD. – Boojum

Respuesta

13

Sí, para los tipos incorporados int x = 1; y int x(1); son lo mismo.

Al construir objetos del tipo de clase, las dos sintaxis de inicialización diferentes son sutilmente diferentes.

Obj x(y); 

Ésta es inicialización directa e instruye al compilador para buscar un constructor sin ambigüedades que se lleva a y, o algo que y se puede convertir implícitamente, y utiliza este constructor para inicializar x.

Obj x = y; 

Ésta es copia de inicialización e instruye al compilador para crear un temporal Obj convirtiendo y y utiliza constructor de copia Obj 's para inicializar x.

Copia initalization es equivalente a inicialización directa cuando el tipo de y es el mismo que el tipo de x.

Para copia de la inicialización, porque el temporal utilizado es el resultado de una conversión implícita, los constructores marcados explicit no se consideran. El constructor de copia para el tipo construido debe ser accesible, pero la compilación puede ser eliminada por el compilador como una optimización.

+0

Y vale la pena señalar que Obj x; x = y; produce aún otra variación.En este caso, x se construirá por defecto. Luego, en la siguiente declaración, se llamará al operador de asignación. –

+3

Otra cosa digna de mención es que permitir que tipos de datos simples antiguos como int se inicialicen de esta manera (con una sintaxis análoga a la invocación de un constructor de clase) permite que las plantillas funcionen de forma transparente tanto con POD como con clases. – Boojum

+1

@Boojum: Agregar esa característica al lenguaje C++ tenía como objetivo proporcionar una forma única de inicializar objetos de cualquier tipo dentro de las listas de inicialización. Esto es para mí más importante (y común) que la inicialización dentro de las plantillas, que podría resolverse con la sintaxis 'Tipo objeto = otro_objeto'. –

0

No soy experto en C++, pero si da el mismo resultado, ¿Importa? Supongo que si estuvieras REALMENTE interesado, podrías compilar (pero no ensamblar) tu código y echar un vistazo a la diferencia.

Editar: Como se ha mencionado en otros lugares, realmente son los mismos para los tipos integrados.

+4

Por supuesto que importa. Es posible que vea los mismos resultados, pero eso podría significar que no sabe qué efectos secundarios buscar o que no sabe sobre todos los casos extremos que le darían resultados diferentes. Esta es una pregunta muy razonable de un programador principiante/intermedio. – mob

1

Para los tipos POD, ambas declaraciones son idénticas.

Cuestiones relacionadas