En este caso específico, ¿existe alguna diferencia entre usar una lista de inicializadores de miembros y asignar valores en un constructor?

Resuelto Stef asked hace 13 años • 12 respuestas

Internamente y sobre el código generado, ¿existe realmente una diferencia entre:

MyClass::MyClass(): _capacity(15), _data(NULL), _len(0)
{
}

y

MyClass::MyClass()
{
  _capacity=15;
  _data=NULL;
  _len=0
}

gracias...

Stef avatar Jan 04 '11 06:01 Stef
Aceptado

Necesita usar la lista de inicialización para inicializar miembros constantes, referencias y clases base.

Cuando necesite inicializar miembros constantes, referencias y pasar parámetros a constructores de clase base, como se menciona en los comentarios, debe usar la lista de inicialización.

struct aa
{
    int i;
    const int ci;       // constant member

    aa() : i(0) {} // will fail, constant member not initialized
};

struct aa
{
    int i;
    const int ci;

    aa() : i(0) { ci = 3;} // will fail, ci is constant
};

struct aa
{
    int i;
    const int ci;

    aa() : i(0), ci(3) {} // works
};

Ejemplo de clase/estructura (no exhaustiva) que contiene la referencia:

struct bb {};

struct aa
{
    bb& rb;
    aa(bb& b ) : rb(b) {}
};

// usage:

bb b;
aa a(b);

Y un ejemplo de inicialización de una clase base que requiere un parámetro (por ejemplo, sin constructor predeterminado):

struct bb {};

struct dd
{
    char c;
    dd(char x) : c(x) {}
};

struct aa : dd
{
    bb& rb;
    aa(bb& b ) : dd('a'), rb(b) {}
};
stefanB avatar Jan 03 '2011 23:01 stefanB

Suponiendo que esos valores sean tipos primitivos, entonces no, no hay diferencia. Las listas de inicialización solo marcan la diferencia cuando tiene objetos como miembros, ya que en lugar de usar la inicialización predeterminada seguida de una asignación, la lista de inicialización le permite inicializar el objeto a su valor final. De hecho, esto puede ser notablemente más rápido.

templatetypedef avatar Jan 03 '2011 23:01 templatetypedef