Lassen Sie mich zunächst erklären, was eine Mem-Initialisierer-Liste ist. Eine mem-Initialisierer-Liste ist eine durch Kommas getrennte Liste von mem-Initialisierern , wobei jeder mem-Initialisierer ein Mitgliedsname ist (, gefolgt von einer Ausdrucksliste , gefolgt von a ). Die Ausdrucksliste gibt an, wie das Mitglied aufgebaut ist. Zum Beispiel in
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)
{
}
};
Die mem-initializer-Liste des vom Benutzer angegebenen Konstruktors ohne Argumente ist name(s_str, s_str + 8), rname(name), crname(name), age(-4). Diese mem-initializer-Liste bedeutet, dass das nameMember vom Konstruktor initialisiert wird, der std::stringzwei Eingabe-Iteratoren verwendet , das rnameMember mit einem Verweis auf initialisiert wird name, das crnameMember mit einem const-Verweis auf initialisiert namewird und das ageMember mit dem Wert initialisiert wird -4.
Jeder Konstruktor hat seine eigene mem-initializer-Liste , und Mitglieder können nur in einer vorgeschriebenen Reihenfolge initialisiert werden (im Grunde die Reihenfolge, in der die Mitglieder in der Klasse deklariert sind). So sind die Mitglieder Examplenur in der Reihenfolge initialisiert werden: ptr, name, pname, rname, crname, und age.
Wenn Sie keinen Mem-Initialisierer eines Mitglieds angeben , lautet der C ++ - Standard:
Wenn die Entität ein nicht statisches Datenelement ... vom Klassentyp ... ist, wird die Entität standardmäßig initialisiert (8.5). ... Andernfalls wird die Entität nicht initialisiert.
Da namees sich hierbei um ein nicht statisches Datenelement vom Klassentyp handelt, wird es standardmäßig initialisiert, wenn namein der mem-initializer-Liste kein Initialisierer für angegeben wurde . Alle anderen Mitglieder von Examplehaben keinen Klassentyp, daher werden sie nicht initialisiert.
Wenn der Standard besagt, dass sie nicht initialisiert sind, bedeutet dies, dass sie einen beliebigen Wert haben können . Da der obige Code nicht initialisiert wurde pname, kann es sich also um alles handeln.
Beachten Sie, dass Sie noch andere Regeln befolgen müssen, z. B. die Regel, dass Verweise immer initialisiert werden müssen. Es ist ein Compilerfehler, Referenzen nicht zu initialisieren.