2010-12-21 13 views
8

Estoy bastante seguro de que esto se ha preguntado antes, pero no puedo por la vida de encontrarlo a través de la búsqueda.C++ Crear una instancia de un objeto de una clase de dos formas diferentes

así que aquí va:

¿Cuál es la diferencia entre:

MyObj myObj; 

y

MyObj myObj = MyObj(); 

creo tanto lograr el mismo resultado, pero es una mejor usar que el otro ? Supongamos que todo lo que quiero es el constructor predeterminado.

* edit - He oído que el primero es más apropiado ya que el segundo crea un objeto a través del constructor predeterminado, luego realiza una asignación a myObj. El primero no es la operación "asignar", por lo que el primero sería "más rápido". ¿Verdad?

+0

Similar pero no exactamente lo mismo que: http: // stackoverflow.com/questions/1581763/difference-between-a-pa-new-a-and-a-pa-new-a –

Respuesta

9

Sí, puede haber una diferencia.

En la primera instancia, myObj no se inicializa si se trata de un tipo POD; de lo contrario, es inicializada por defecto.

En el segundo ejemplo myObj es copia-inicializado de un valor inicializado temporal. El temporal puede (y casi seguramente debería) eliminarse para que el efecto valor-inicialización.

Si MyObj tiene un constructor, se llamará siempre a un constructor. Para el primer caso, se debe poder acceder a un constructor predeterminado; para el segundo, se debe tener acceso tanto a la copia como a los constructores predeterminados, aunque solo se puede invocar al constructor predeterminado.

Además de la obvia diferencia entre "no inicializado" y valor inicializado para los tipos de POD, hay una diferencia entre default-inicializado y valor inicializado para este tipo de no-POD sin el usuario constructores definidos. Para estos tipos, los miembros POD no se inicializan en inicialización predeterminada pero con cero inicializado en valor inicialización de la clase principal.

4

La primera es una declaración, la última una inicialización.

Si MyObj no es un POD, en realidad no existe diferencia, excepto que debe existir un constructor de copia y ser accesible en este último caso (aunque no se llame).

Si MyObj es un POD, entonces el primero no lo inicializa, el contenido de las variables miembro de MyObj no se especificará. Esta última es la única forma de 'cero' inicializar un POD no agregado.

+0

No he buscado el estándar. Pero el segundo no sería 'declaración e inicialización'. –

+0

Técnicamente, la primera es una definición ... –

+0

Ambas son declaraciones, ya que cada definición es una declaración, y ambas son definiciones. El segundo párrafo de esta respuesta contradice la última oración de la respuesta de Charles (esto dice que no hay diferencia, Charles dice que hay una diferencia si el constructor predeterminado es generado por el compilador). Charles tiene razón, para C++ 03. En C++ 98 están ambos construidos por defecto. –

0

Sin muchas explicaciones: la primera usa el constructor predeterminado para inicializar su myObj. El segundo realmente crea una instancia temporal, y luego usa un constructor de copia para inicializar myObj. (recuerde que también se crea un constructor de copia predeterminado, y no solo un constructor predeterminado)

Cuestiones relacionadas