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 name
Member vom Konstruktor initialisiert wird, der std::string
zwei Eingabe-Iteratoren verwendet , das rname
Member mit einem Verweis auf initialisiert wird name
, das crname
Member mit einem const-Verweis auf initialisiert name
wird und das age
Member 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 Example
nur 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 name
es sich hierbei um ein nicht statisches Datenelement vom Klassentyp handelt, wird es standardmäßig initialisiert, wenn name
in der mem-initializer-Liste kein Initialisierer für angegeben wurde . Alle anderen Mitglieder von Example
haben 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.