Historia del tema:
En las versiones tempranas de C++, todos los miembros de la clase debían ser inicializados ya sea en la lista de inicialización del constructor o en el cuerpo del constructor. Con la llegada de C++11, se hizo posible la inicialización de miembros no estáticos de la clase directamente en el lugar de su definición — esto mejoró significativamente la legibilidad y disminuyó la probabilidad de errores con variables no inicializadas.
Problema:
La falta de inicialización por defecto conducía a un comportamiento no evidente para los desarrolladores, especialmente al aparecer nuevos constructores. No había garantía de que los miembros de la clase siempre estuvieran inicializados. La belleza y novedad del enfoque reside en la reducción del boilerplate code.
Solución:
La inicialización en línea asigna un valor por defecto a un miembro de la clase si no ha sido explícitamente inicializado en la lista de inicialización del constructor.
Ejemplo de código:
class Widget { int value = 42; std::string name{"default"}; public: Widget() {} Widget(int v) : value(v) {} };
Características clave:
¿Se usará el valor de la inicialización en línea si el miembro se asigna en la lista de inicialización del constructor?
No, se usará el valor de la lista de inicialización del constructor. Ejemplo:
class Test { int a = 10; public: Test(int x) : a(x) {} }; Test t(42); // a == 42
¿Se pueden inicializar en línea miembros estáticos de la clase?
No, solo los no estáticos. Los miembros estáticos de la clase se inicializan por separado fuera de la clase.
¿Se pueden usar expresiones para la inicialización de miembros de la clase en línea?
Para miembros simples — sí (por ejemplo, llamada a un constructor o literal). Para cálculos complejos, use una función o inicialización en el constructor.
El equipo agregó un nuevo constructor, pero olvidó inicializar un campo. Quedó con un valor no inicializado. Esto causaba un fallo al acceder a la variable.
Ventajas:
Desventajas:
Se aplicó la inicialización en línea a todos los campos de la clase. En los nuevos constructores no era necesario escribir explícitamente la inicialización, lo que redujo la cantidad de boilerplate y errores.
Ventajas:
Desventajas: