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::string
construtor que leva dois iterators de entrada , o rname
membro é inicializado com uma referência para name
, o crname
membro é inicializado com um const-referência para name
, e o age
membro é 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 Example
só 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 name
sido especificado na lista de inicializadores de mem . Todos os outros membros de Example
nã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.