En este caso específico, ¿existe alguna diferencia entre usar una lista de inicializadores de miembros y asignar valores en un constructor?
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...
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) {}
};
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.