El inicializador de miembro por defecto es una construcción de C++11 que permite declarar valores predeterminados directamente al declarar las variables miembro de la clase. Esta capacidad a menudo se confunde con otros métodos de inicialización de datos.
Las versiones tempranas de C++ no permitían inicializar miembros directamente en la declaración; los valores solo se asignaban en el constructor (en el cuerpo o en la lista de inicialización). La introducción de inicializadores de miembro por defecto (C++11) mejoró la legibilidad y redujo el riesgo de errores de inicialización indefinida.
Si los campos no se inicializan explícitamente, contienen un valor "basura" (indefinido). La asignación dentro del constructor es menos eficiente en comparación con la lista de inicialización, y el ignorar los inicializadores de miembro por defecto complica la extensión de clases y la creación de nuevos constructores.
Usar inicializadores de miembro por defecto para valores simples, y para casos complejos (especialmente si se necesita un valor dependiente o no estándar) — listas de inicialización del constructor.
Ejemplo de código:
class Widget { int x = 42; // inicializador de miembro por defecto std::string name = "default"; // inicializador de miembro por defecto public: Widget() = default; // x=42, name="default" Widget(int xx) : x(xx), name("new") {}// x=xx, name="new" };
Características clave:
¿Se aplicará el inicializador de miembro por defecto si el miembro se inicializa dentro del cuerpo del constructor, pero no en la lista de inicialización?
Respuesta:
No. Si no se especifica en la lista de inicialización, la variable se inicializa primero con el valor por defecto (inicializador de miembro por defecto) y luego, dentro del cuerpo del constructor, se realiza la asignación, lo que es menos eficiente.
¿Cuál es el orden de inicialización de los miembros de la clase con inicializadores de miembro por defecto en la herencia?
Respuesta:
Primero se inicializan los miembros de la clase base y luego los de la clase derivada; para cada miembro con inicializador de miembro por defecto, primero se usa la lista de inicialización del constructor, si se proporciona, luego el inicializador de miembro por defecto, de lo contrario, queda sin inicializar (para POD). No ocurre "doble inicialización".
¿Puede aplicarse el inicializador de miembro por defecto a miembros estáticos de la clase?
Respuesta:
No, los miembros estáticos no pueden ser inicializados mediante el inicializador de miembro por defecto. Deben ser inicializados fuera de la clase o mediante inline static en C++17.
Ejemplo:
struct S { static int a = 5; // ¡Error! };
Clase con una cadena dinámica, que se olvida de inicializar en algunos constructores. Más tarde, al acceder — comportamiento indefinido.
Ventajas:
Desventajas:
Todos los campos tienen inicializadores de miembro por defecto. Los constructores adicionales inicializan explícitamente los miembros necesarios a través de la lista de inicialización cuando es necesario.
Ventajas:
Desventajas: