Primero, déjame explicarte qué es una lista de inicializadores de memoria . Una mem-initializer-list es una lista separada por comas de mem-initializer s, donde cada mem-initializer es un nombre de miembro seguido de (
, seguido de una lista de expresiones , seguida de a )
. La lista de expresiones es cómo se construye el miembro. Por ejemplo, en
static const char s_str[] = "bodacydo";
class Example
{
private:
int *ptr;
string name;
string *pname;
string &rname;
const string &crname;
int age;
public:
Example()
: name(s_str, s_str + 8), rname(name), crname(name), age(-4)
{
}
};
la lista mem-initializer- del constructor proporcionado por el usuario, sin argumentos es name(s_str, s_str + 8), rname(name), crname(name), age(-4)
. Esta lista de inicialización de mem significa que el name
miembro se inicializa por el std::string
constructor que toma dos iteradores de entrada , el rname
miembro se inicializa con una referencia a name
, el crname
miembro se inicializa con una referencia constante name
y el age
miembro se inicializa con el valor -4
.
Cada constructor tiene su propia mem-initializer-list , y los miembros solo pueden inicializarse en un orden prescrito (básicamente el orden en que se declaran los miembros en la clase). Por lo tanto, los miembros de Example
sólo pueden ser inicializados en el orden: ptr
, name
, pname
, rname
, crname
, y age
.
Cuando no especifica un mem-initializer de un miembro, el estándar C ++ dice:
Si la entidad es un miembro de datos no estático ... de tipo de clase ..., la entidad se inicializa por defecto (8.5). ... De lo contrario, la entidad no se inicializa.
Aquí, debido a que name
es un miembro de datos no estático de tipo de clase, se inicializa por defecto si no name
se especificó ningún inicializador para en la lista de inicialización de mem . Todos los demás miembros de Example
no tienen tipo de clase, por lo que no se inicializan.
Cuando el estándar dice que no están inicializados, esto significa que pueden tener cualquier valor. Por lo tanto, debido a que el código anterior no se inicializó pname
, podría ser cualquier cosa.
Tenga en cuenta que aún debe seguir otras reglas, como la regla de que las referencias siempre deben inicializarse. Es un error del compilador no inicializar referencias.