Como ya se ha respondido, las listas de inicialización se ejecutan por completo antes de ingresando al bloque constructor. Por lo tanto, es completamente seguro usar miembros (inicializados) en el cuerpo constructor.
Ha hecho un comentario en la respuesta aceptada acerca de tener que referirse a los argumentos del constructor, pero no al miembro vars dentro del bloque del constructor. Tu no
Es posible que se confundió con el hecho de que debe referirse a parámetros y no al miembro de atributos dentro la lista de inicialización. Como un ejemplo, dado un X clase que tiene dos miembros (a_ y b_) de tipo int, el siguiente constructor puede ser mal definida:
X::X(int a) : a_(a), b(a_*2) {}
La posible problema aquí es que la construcción de los elementos de la La lista de inicialización depende del orden de declaración en la clase y no del orden en el que escribe la lista de inicialización. Si la clase se define como:
class X
{
public:
X(int a);
private:
int b_;
int a_;
};
Entonces, independientemente de cómo se escribe la lista de inicialización, el hecho es que b_ (a_ * 2) será ejecutado antes a_ se inicializa desde la declaración de la miembros es primero b_ y luego a_. Eso creará un error ya que su código cree (y probablemente dependa) en que b_ tiene el doble del valor de a_, y de hecho b_ contiene basura.La solución más simple no está refiriendo a los miembros:
X::X(int a) : a_(a), b(a*2) {} // correct regardless of how X is declared
evitar este escollo es la razón por la cual se sugiere no utilizar miembro de atributos como parte de la inicialización de otros miembros.
Me hace preguntarme por qué la gente simplemente no intenta compilar la fuente primero :) – arul
@arul: @dehmann solo puede tener un compilador. Si ese comportamiento está definido por la implementación, la compilación no ayudará. Debería consultar el estándar. – paxdiablo
Sí, solo compilar y probar no dice si funcionará igual en todas partes. – Frank