2011-07-25 21 views
68

Duplicar posible:
C++ initialization listsC++: Donde inicializar variables en el constructor

¿Cuáles son las ventajas/desventajas de la inicialización de las variables en la opción 1 opción 2 vs?

class MyClass 
{ 
public: 
    MyClass(float f, char a); 
private: 
    float mFloat; 
    char mCharacter; 
    bool mBoolean; 
    int mInteger; 
}; 

MyClass::MyClass(float f, char a) : mFloat(f), mBoolean(true) // option 1. 
{ 
    // option 2 
    mCharacter = a; 
    mInteger = 0; 
} 

Editar: ¿Por qué es tan común la opción 2?

+0

un duplicado con la edición añadido. dado que la opción 1 aparentemente es mejor, me llama la atención por qué la opción 2 es tan común. –

+0

Puede ser un duplicado, pero parece que no hay respuesta en la otra pregunta es exhaustiva. –

Respuesta

92

En resumen, siempre prefiera las listas de inicialización cuando sea posible. 2 razones:

  • Si usted no menciona una variable en la lista de inicialización de una clase, el constructor por defecto se inicializarlo antes de entrar en el cuerpo del constructor que has escrito. Esto significa que la opción 2 dará lugar a que cada variable se escriba dos veces, una para la inicialización predeterminada y otra para la asignación en el cuerpo del constructor.

  • Además, como se ha mencionado por mwigdahl y kedavra en otras respuestas, miembros const y miembros de referencia puede única ser inicializado en una lista de inicialización.

También tenga en cuenta que las variables siempre se inicializan en el orden en que se declaran en la declaración de la clase, no en el orden en que aparecen en una lista de inicialización (con advertencias apropiadas permitió un compilador le advertirá si una lista es escrito fuera de orden). De manera similar, los destructores llamarán a los destructores miembros en el orden opuesto, del último al primero en la declaración de clase, después de que se haya ejecutado el código en el destructor de su clase.

+0

Gracias por la respuesta informativa. Refiérase a la opción 2, ¿es ese el estándar o es algún compilador específico? No creo que sea demasiado difícil para un compilador optimizar los derechos iniciales. Prefiero la opción 2 porque es más limpia. – 0fnt

+5

¿No debería un compilador ser capaz de optimizar la inicialización automática innecesaria? Quiero decir, C# y Java pueden hacerlo, así que debería C++, ¿verdad? – Joey

+0

Esto se llama "lista de inicialización", no "lista de inicialización". – duleshi

19

Aunque no se aplica a este ejemplo específico, la Opción 1 le permite inicializar las variables miembro de tipo de referencia (o tipo const, como se indica a continuación). La opción 2 no. En general, la Opción 1 es el enfoque más poderoso.

+0

Correcto, pero él no tiene ningún tipo de referencia. Entonces la Opción 2 está bien. –

+0

En su ejemplo específico (que parece artificial en lugar de tomarse del código del mundo real), ¡sí! En el caso más general, la Opción 1 es a menudo superior, que es a lo que me refería. Voy a editar para que quede más claro. – mwigdahl

3

La opción 1 le permite usar un lugar especificado exactamente para inicializar explícitamente variables miembro.

8

Ver Should my constructors use "initialization lists" or "assignment"?

En pocas palabras: en su caso específico, no cambia nada. Pero:

  • para los miembros de clase/struct con constructores, puede ser más eficiente opción 1.
  • única opción 1 le permite inicializar los miembros de referencia a utilizar.
  • única opción 1 le permite inicializar los miembros const
  • única opción 1 le permite inicializar las clases base utilizando su constructor
  • única opción 2 le permite inicializar matriz o estructuras que no tienen un constructor.

Supongo por qué la opción 2 es más común es que la opción 1 no es muy conocida, como tampoco sus ventajas. La sintaxis de la Opción 2 es más natural para el nuevo programador de C++.

Cuestiones relacionadas