De lo que sé de los beneficios de usar la lista de inicialización es que proporcionan eficacia al inicializar los miembros de la clase que no son integrables. Por ejemplo,Beneficios de las listas de inicialización
Fred::Fred() : x_(whatever) { }
es preferible,
Fred::Fred() { x_ = whatever; }
si x es un objeto de una clase personalizada. Aparte de eso, este estilo se utiliza incluso con tipos incorporados en aras de la coherencia.
El beneficio más común de hacer esto es un mejor rendimiento. Si la expresión sea del mismo tipo que la variable miembro x_, el resultado de cualquier expresión se construye directamente dentro de x_ - el compilador no hace una copia separada del objeto.
Con el otro estilo, la expresión cualquiera causa que se cree un objeto temporal por separado, y este objeto temporal se pasa al operador de asignación del objeto x_. Entonces ese objeto temporal es destruido en el; Eso es ineficiente.
Pregunta
¿Hay alguna ganancia de eficiencia en el siguiente ejemplo con la utilización de la lista de inicialización. Creo que no hay ganancia. La primera versión llama al constructor de copia de cadena y al operador de asignación de cadena de otras llamadas (no se crea ninguna temporal). ¿Correcto?
class MyClass
{
public:
MyClass(string n):name(n) { }
private:
string name;
};
class MyClass
{
public:
MyClass(string n)
{
name=n;
}
private:
string name;
};
El otro beneficio de las listas de inicialización (si lo quiere llamar un beneficio) es que son la única forma de inicializar ciertas cosas: clases base utilizando un ctor no predeterminado, miembros de const y miembros de referencia. –
Además, si le preocupa el rendimiento, prefiero usar un 'const &' para pasar el argumento, en lugar de copiar. –
¿Cómo se puede tener 'Fred :: Fred(): x_ (lo que sea)'? Fred no tiene argumentos. –