En primer lugar, déjame explicarte qué mem-initializer-list es. A mem-inicializador-lista es una lista separada por comas de mem-inicializador s, donde cada mem-inicializador es un nombre de miembro seguido por (
, seguido de un expresión-lista, seguido de un )
. 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)
{
}
};
el inicializador-lista mem del constructor suministrados por el usuario, no hay argumentos es name(s_str, s_str + 8), rname(name), crname(name), age(-4)
. Este mem-inicializador-lista significa que el miembro de name
se inicializa por the std::string
constructor that takes two input iterators, el miembro de rname
se inicializa con una referencia a name
, el miembro crname
se inicializa con un const-referencia a name
, y el miembro de age
se inicializa con el valor -4
.
Cada constructor tiene su propia mem-initializer-list, y los miembros solo se pueden inicializar en un orden prescrito (básicamente el orden en el que los miembros se declaran en la clase).Por lo tanto, los miembros de Example
solo se pueden inicializar en el orden: ptr
, name
, pname
, rname
, crname
y age
.
Cuando no se especifica un mem-inicializador de un miembro, el estándar C++ dice:
Si la entidad es un miembro de datos no estático ... del tipo de clase ..., la entidad está inicializado por defecto (8.5). ... De lo contrario, la entidad no se inicializa.
Aquí, debido name
es un miembro de datos no estático del tipo de clase, es default-inicializado si no hay inicializador para name
se especificó en el mem-inicializador lista. Todos los demás miembros de Example
no tienen el 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, como el código anterior no inicializó pname
, podría ser cualquier cosa.
Tenga en cuenta que todavía tiene que seguir otras reglas, como la regla de que las referencias siempre deben inicializarse. Es un error del compilador no inicializar las referencias.
Para recomendaciones de libros, consulte http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –
Mike, uy, me refiero al capítulo de algún libro que lo explica. ¡No es un libro completo! :) – bodacydo
Probablemente sería una buena idea leer todo un libro en un idioma en el que intenta programar. Y si ya leíste uno y no explicaba esto, entonces no era un libro muy bueno. –