Tout d'abord, laissez-moi vous expliquer ce qu'est une liste d'initialisation de mémoire . Un mem-initializer-list est une liste de mem-initializer séparés par des virgules , où chaque mem-initializer est un nom de membre suivi de (, suivi d'une liste d'expressions , suivi d'un ). La liste d'expressions est la façon dont le membre est construit. Par exemple, dans
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 liste-initialiseur-mem du constructeur sans arguments fourni par l'utilisateur est name(s_str, s_str + 8), rname(name), crname(name), age(-4). Cette mem-initializer-list signifie que le namemembre est initialisé par le std::stringconstructeur qui prend deux itérateurs d'entrée , le rnamemembre est initialisé avec une référence à name, le crnamemembre est initialisé avec une référence const à name, et le agemembre est initialisé avec la valeur -4.
Chaque constructeur a sa propre liste d'initialisation de mémoire et les membres ne peuvent être initialisés que dans un ordre prescrit (essentiellement l'ordre dans lequel les membres sont déclarés dans la classe). Ainsi, les membres de Examplene peuvent être initialisés dans l'ordre: ptr, name, pname, rname, crnameet age.
Lorsque vous ne spécifiez pas de mem-initializer d'un membre, le standard C ++ dit:
Si l'entité est un membre de données non statique ... de type classe ..., l'entité est initialisée par défaut (8.5). ... Sinon, l'entité n'est pas initialisée.
Ici, étant donné qu'il names'agit d'un membre de données non statique de type classe, il est initialisé par défaut si aucun initialiseur pour namen'a été spécifié dans la liste mem-initializer . Tous les autres membres de Examplen'ont pas de type de classe, ils ne sont donc pas initialisés.
Lorsque le standard dit qu'ils ne sont pas initialisés, cela signifie qu'ils peuvent avoir n'importe quelle valeur. Ainsi, comme le code ci-dessus ne s'est pas initialisé pname, cela pourrait être n'importe quoi.
Notez que vous devez toujours suivre d'autres règles, telles que la règle selon laquelle les références doivent toujours être initialisées. Le fait de ne pas initialiser les références est une erreur du compilateur.