En las primeras versiones de C++, los miembros de la clase se inicializaban dentro del constructor mediante asignación. Posteriormente, se introdujo la posibilidad de inicializar los miembros de la clase antes de entrar en el cuerpo del constructor a través de una lista de inicialización, lo cual es críticamente importante para los miembros constantes, referencias y el rendimiento.
Algunos miembros de la clase (por ejemplo, campos const o referencias) no pueden ser inicializados mediante asignación dentro del cuerpo del constructor; deben ser establecidos en el momento de la creación. Además, si se utiliza la asignación, primero se llamará al constructor por defecto y luego se realizará la asignación (dos acciones), lo que puede ser costoso para objetos complejos:
class Example { const int x; std::string str; public: Example(int val, const std::string& s) : x(val), str(s) {} };
Utiliza una lista de inicialización para inicializar inmediatamente los miembros de la clase. Esto es especialmente importante para const, referencias, clases miembro sin constructor por defecto, así como para el rendimiento al trabajar con clases de STL y estructuras grandes.
Ejemplo de código:
class Point { const int x; int& y; public: Point(int val, int& ref) : x(val), y(ref) {} };
Características clave:
¿Se puede modificar el orden de inicialización de los miembros de la clase a través del orden en la lista de inicialización del constructor?
¡No! Los miembros siempre se inicializan en el orden en que se declaran en la clase, no en el orden de la lista de inicialización. Ignorar esta regla conduce a errores de orden de inicialización.
¿Qué sucederá si un miembro-referencia no se inicializa en la lista de inicialización, sino solo en el cuerpo del constructor?
¡Error de compilación! Una referencia, al igual que los campos const, solo se puede inicializar en la lista de inicialización: deben recibir un valor antes de entrar en el cuerpo del constructor.
¿Después de inicializar un miembro const en la lista de inicialización, se puede cambiar en el cuerpo del constructor?
No, un miembro constante no se puede cambiar después de la inicialización; intentar cambiar tal campo resultará en un error de compilación.
En el constructor, un miembro de la clase se inicializa dentro del cuerpo del constructor. Para objetos complejos, se gastan recursos en llamar al constructor por defecto, luego en la asignación, y después en destruir el objeto temporal.
Ventajas:
Desventajas:
Todos los miembros se inicializan de inmediato en la lista de inicialización, no hay operaciones adicionales ni problemas con campos inmutables.
Ventajas:
Desventajas: