HOWTO · C++
Inicialización de valores predeterminados de la estructura de C++
Los inicializadores de llaves o iguales se utilizan para inicializar los valores predeterminados en una estructura en C++.
En esta página
Declara un valor predeterminado para un miembro dentro de la definición de struct mediante un inicializador con llaves o con signo igual, por ejemplo, int age = 30;. Un objeto usa ese valor cuando, al construirse, no se proporciona otro inicializador para ese miembro. Un constructor puede asignar un valor específico para un objeto en su lista de inicializadores, mientras los demás miembros conservan sus valores predeterminados declarados.
Qué hacen los inicializadores predeterminados de los miembros
Un inicializador predeterminado de miembro se asocia a un miembro de datos en la definición del tipo. Le proporciona un valor durante la construcción cuando el constructor no lo inicializa explícitamente. Así, un tipo de datos sencillo puede ofrecer valores predeterminados útiles sin añadir un constructor cuyo único propósito sea asignarlos.
El inicializador se aplica siempre que la construcción deja ese miembro con su valor predeterminado. Esto no obliga a que todos los objetos tengan el mismo valor: un constructor puede elegir uno distinto para un objeto concreto. El inicializador predeterminado forma parte de la inicialización; no es una asignación que se ejecuta después de construir el objeto. Los miembros sin inicializador predeterminado todavía deben inicializarse mediante el constructor u otra forma de inicialización aplicable antes de leer sus valores.
Cómo declarar inicializadores predeterminados de los miembros
Escribe cada inicializador en la declaración del miembro, dentro de las llaves de struct. C++ permite usar un inicializador con signo igual, como int age = 30;, o uno con llaves, como int age{30};. Elige la forma que mejor se adapte al tipo del miembro y a tu estilo, y termina cada declaración con punto y coma.
Después de la llave de cierre de la definición de struct va un punto y coma. No pongas una coma después de la última declaración de miembro. Estos signos de puntuación pertenecen a partes distintas de la definición: las declaraciones de los miembros terminan con punto y coma, y la definición del tipo termina con };.
Cómo sobrescribir los valores predeterminados al crear un objeto
Cuando un constructor inicializa un miembro en su lista de inicializadores, ese valor se usa para ese objeto en lugar del valor predeterminado declarado para el miembro. La lista nombra los miembros después de los dos puntos del constructor; por ejemplo, explicit Person(int a) : age(a) {}. Los miembros que se omiten en la lista aún pueden usar sus inicializadores predeterminados.
Este comportamiento resulta útil cuando la mayoría de los objetos deben compartir valores predeterminados razonables, pero algunos necesitan valores procedentes de una entrada o del estado de la aplicación. El constructor debe inicializar los miembros controlados por sus parámetros; los valores predeterminados siguen siendo útiles para los demás. Si siempre se proporcionan todos los miembros al construir el objeto, quizá no hagan falta valores predeterminados. Aun así, conservarlos puede servir para otras formas de construcción que dejan algún miembro con su valor predeterminado.
Reglas y un ejemplo completo
Un struct de C++ es un tipo cuyos miembros y clases base son públicos de forma predeterminada; sigue siendo un tipo con el que se crean objetos. Un struct también puede contener funciones miembro y participar en la herencia. Estas propiedades no cambian el funcionamiento de los valores predeterminados de los miembros: el valor se declara junto al miembro y prevalece el valor de la lista de inicializadores del constructor para el miembro que esta inicializa.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
#include <iostream>
#include <string>
struct Person {
std::string name = "John Doe";
int age = 30;
Person() = default;
explicit Person(int a) : age(a) {}
};
int main() {
Person defaultPerson;
Person namedPerson(25);
std::cout << defaultPerson.name << ", " << defaultPerson.age << '\n';
std::cout << namedPerson.name << ", " << namedPerson.age << '\n';
}
John Doe, 30
John Doe, 25
En la ejecución satisfactoria proporcionada, el primer objeto usa ambos valores predeterminados declarados. El segundo recibe la edad 25 de su constructor, mientras que su nombre conserva el valor predeterminado declarado. La salida muestra los nombres «John Doe» en inglés.