C ++: Donde inicializar variables en constructor

Posible duplicado:
Listas de inicialización de C ++

¿Cuáles son los pros / contras de inicializar variables en la opción 1 frente a la opción 2?

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é la opción 2 es tan común?

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

  • Si no menciona una variable en la lista de inicialización de una clase, el constructor la inicializará por defecto antes de ingresar el cuerpo del constructor que ha 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 mencionan mwigdahl y avada en otras respuestas, los miembros de const y los miembros de referencia solo se pueden inicializar 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 statement de clase, no en el orden en que se enumeran en una lista de inicialización (con las advertencias adecuadas habilitadas, un comstackdor le advertirá si una lista se escribe fuera de orden). De manera similar, los destructores llamarán a los destructores miembros en el orden opuesto, del último al primero en la statement de clase, después de que se haya ejecutado el código en el destructor de su clase.

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

Ver ¿Deberían mis constructores usar “listas de inicialización” o “asignación”?

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

  • para miembros de clase / estructura con constructores, puede ser más eficiente usar la opción 1.
  • solo la opción 1 le permite inicializar los miembros de referencia.
  • solo la opción 1 le permite inicializar miembros de const
  • solo la opción 1 le permite inicializar clases base usando su constructor
  • solo la opción 2 le permite inicializar una matriz o estructuras que no tienen un constructor.

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

La Opción 1 le permite utilizar un lugar especificado exactamente para inicializar explícitamente las variables miembro.

Hay muchas otras razones. Siempre debe inicializar todas las variables miembro en la lista de inicialización si es posible.

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6

La opción 1 le permite inicializar miembros de const . Esto no se puede hacer con la opción 2 (ya que están asignados a, no inicializados).

¿Por qué se debe intializar a los miembros de la estructura en el inicializador del constructor en lugar de en su cuerpo?