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 name
membre est initialisé par le std::string
constructeur qui prend deux itérateurs d'entrée , le rname
membre est initialisé avec une référence à name
, le crname
membre est initialisé avec une référence const à name
, et le age
membre 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 Example
ne peuvent être initialisés dans l'ordre: ptr
, name
, pname
, rname
, crname
et 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 name
s'agit d'un membre de données non statique de type classe, il est initialisé par défaut si aucun initialiseur pour name
n'a été spécifié dans la liste mem-initializer . Tous les autres membres de Example
n'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.