Nicht-Zeiger-Klassenmitglieder initialisieren

8

In letzter Zeit habe ich viel über Konstrukteure aus den gut erhaltenen C ++ - FAQ gelesen . Einer der Einträge erwähnt, dass es immer am besten ist, Initialisierungslisten zu verwenden, anstatt Klassenmitglieder innerhalb des Codeblocks des Konstruktors selbst zu initialisieren.

Dies liegt daran, dass der Compiler eher dazu neigt, mehrere Kopien der Klassenmitglieder als nur eine Kopie zu erstellen.

Beispiel

Gut

%Vor%

Schlecht

%Vor%

Eine Sache, die es auch angibt (und dies bezieht sich auf Konstruktoren, bezieht es sich auch auf die reine Initialisierung von Objekten im Allgemeinen von sogar nicht-Mitgliedsfunktionen) ist, dass beim Initialisieren eines Objekts durch Methoden wie folgt:

%Vor%

Sie werden, und ich zitiere: "[declare] a non-member function that returns a Foo object" .

(für weitere Informationen klicken Sie auf den obigen Link)

Die Frage

Aus diesem Grund ist es unklug, Folgendes zu haben:

%Vor%

Oder auch das:

%Vor%

Aufgrund der Art und Weise, wie diese zugewiesen werden (d. h. die Tatsache, dass es sich um Nicht-Zeiger handelt), frage ich mich, ob diese Objekte überhaupt eine Initialisierung zu Beginn benötigen oder nicht. Wenn dies der Fall ist, ist dies die richtige Methode, dies zu tun? Oder gibt es eine bessere Methode der Initialisierung?

Wie das mit der Frage

zusammenhängt

Dies bezieht sich auf die allgemeine Frage aufgrund der Art und Weise, in der sich die Methodik der C ++ - Konstruktorinitialisierung sowohl auf die Initialisierung von Objekten unter Verwendung von Konstruktorfunktionen bezieht, als auch auf die Tatsache, dass ich nicht weiß, ob auf dem Stapel zugeordnete Objekte oder nicht Ich glaube sowieso - (egal, ob Objekte ohne Zeigerzuweisung) sogar Initialisierung an erster Stelle.

    
zeboidlund 18.01.2012, 23:19
quelle

1 Antwort

12

Wenn eine Membervariable von einem Klassentyp mit einem von einem Benutzer deklarierten Standardkonstruktor ist, müssen Sie sie nicht explizit in der Initialisierungsliste angeben: Ihr Standardkonstruktor wird während der Konstruktion sowieso vor dem Rumpf des Konstruktors aufgerufen ist eingegeben.

Wenn eine Elementvariable ein primitiver Typ ist (wie int oder bool ) oder ein Klassentyp ist, der keine vom Benutzer deklarierten Konstruktoren hat, müssen Sie ihn explizit initialisieren, anderenfalls wird dies nicht der Fall sein initialisiert (und es wird einen unbekannten Wert haben; Sie können ein nicht initialisiertes Objekt nicht lesen).

    
James McNellis 18.01.2012, 23:22
quelle