Tout d'abord, laissez-moi vous expliquer ce qu'est un mem-initialiseur-liste est. Un mem-initialiseur-liste est une liste séparée par des virgules des mem-initialiseurs, où chaque mem-initialiseur est le nom d'un membre suivi par (
, suivi par une expression de la liste, suivi par un )
. L' expression-de la liste 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)
{
}
};
les mem-initialiseur-liste de l'utilisateur fourni, non-arguments constructeur name(s_str, s_str + 8), rname(name), crname(name), age(-4)
. Cette mem-initialiseur-liste des moyens que l' name
membre est initialisé par l' std::string
constructeur qui prend deux itérateurs, l' rname
membre est initialisé avec une référence à l' name
, crname
membre est initialisé avec un const référence- name
, et l' age
membre est initialisé avec la valeur -4
.
Chaque constructeur a sa propre mem-initialiseur-liste, et les membres ne peut être initialisé dans un certain ordre (en gros, l'ordre dans lequel les membres sont déclarées dans la classe). Ainsi, les membres de l' Example
ne peut être initialisé lors de la commande: ptr
, name
, pname
, rname
, crname
, et age
.
Lorsque vous ne spécifiez pas un mem-initialiseur d'un membre, la norme C++, dit:
Si l'entité est un non membre de données ... de type de classe ..., l'entité est par défaut-initialisé (8.5). ... Dans le cas contraire, l'entité n'est pas initialisé.
Ici, parce qu' name
est un non membre de données de type de classe, il est par défaut-initialisé si pas d'initialiseur pour name
a été spécifié dans la mem-initialiseur-liste. Tous les autres membres de l' Example
n'ont pas de type de classe, de sorte qu'ils ne sont pas initialisés.
Lorsque la norme dit qu'ils ne sont pas initialisés, cela signifie qu'elles peuvent avoir aucune valeur. Ainsi, parce que le code ci-dessus n'a pas initialiser pname
, il pourrait être n'importe quoi.
Notez que vous devez toujours suivre d'autres règles, telles que la règle de références doivent toujours être initialisé. C'est une erreur de compilateur de ne pas initialiser les références.