Es una lista de inicialización.
Al momento de ingresar al cuerpo del constructor, todos los campos ya se han construido; si tienen constructores por defecto, esos ya fueron llamados. Ahora, si les asigna un valor en el cuerpo del constructor, está llamando al operador de asignación de copia, lo que puede significar liberar y volver a adquirir recursos (por ejemplo, memoria) si el objeto tiene alguno.
Por lo tanto, en el caso de tipos primitivos como int, no hay ninguna ventaja en comparación con asignarlos en el cuerpo del constructor. En el caso de objetos que tienen un constructor, es una optimización del rendimiento porque evita pasar por dos inicializaciones de objetos en lugar de una.
Una lista de inicialización es necesaria si uno de los campos es una referencia porque una referencia nunca puede ser nula, ni siquiera en el breve tiempo entre la construcción del objeto y el cuerpo del constructor. A continuación se plantea C2758 de error: 'MyClass :: member_': Se debe inicializar en la base del constructor/lista de inicialización miembro de
class MyClass {
public :
MyClass(std::string& arg) {
member_ = arg;
}
std::string& member_;
};
La única forma correcta es:
class MyClass {
public :
MyClass(std::string& arg)
: member_(arg)
{
}
std::string& member_;
};
Es también a veces una necesidad para utilizar el lista de inicialización de miembros Si tiene una variable miembro que es una referencia, debe configurarla utilizando la lista de inicialización de miembros. – Skurmedel