Primeiro, deixe-me explicar o que é uma lista de inicializadores de mem . Um mem-inicializador-lista é uma lista separada por vírgulas de mem-inicializador s, onde cada mem-inicializador é um nome membro seguido por (, seguido por uma lista de expressão , seguido por um ). A lista de expressões é como o membro é construído. Por exemplo, em
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)
{
}
};
a lista de inicializadores de mem do construtor sem argumentos fornecido pelo usuário name(s_str, s_str + 8), rname(name), crname(name), age(-4). Essa lista de inicializadores de memórias significa que oname membro é inicializado pelo std::stringconstrutor que leva dois iterators de entrada , o rnamemembro é inicializado com uma referência para name, o crnamemembro é inicializado com um const-referência para name, e o agemembro é inicializado com o valor -4.
Cada construtor tem seu próprio lista de inicializadores de memórias e os membros podem ser inicializados apenas em uma ordem prescrita (basicamente a ordem na qual os membros são declarados na classe). Assim, os membros Examplesó podem ser inicializados na ordem: ptr, name, pname, rname, crname, e age.
Quando você não especifica um mem-inicializador de um membro, o padrão C ++ diz:
Se a entidade for um membro de dados não estático ... do tipo de classe ..., a entidade será inicializada por padrão (8.5). ... Caso contrário, a entidade não será inicializada.
Aqui porque name ser um membro de dados não estáticos do tipo de classe, ele será inicializado por padrão se nenhum inicializador tiver namesido especificado na lista de inicializadores de mem . Todos os outros membros de Examplenão têm tipo de classe, portanto, não são inicializados.
Quando o padrão diz que eles não foram inicializados, isso significa que eles podem ter qualquer valor. Assim, como o código acima não foi inicializado pname, poderia ser qualquer coisa.
Observe que você ainda precisa seguir outras regras, como a regra de que as referências sempre devem ser inicializadas. É um erro do compilador não inicializar referências.