Gibt es in diesem speziellen Fall einen Unterschied zwischen der Verwendung einer Memberinitialisierungsliste und dem Zuweisen von Werten in einem Konstruktor?
Intern und über den generierten code, gibt es einen wirklich Unterschied zwischen :
MyClass::MyClass(): _capacity(15), _data(NULL), _len(0)
{
}
und
MyClass::MyClass()
{
_capacity=15;
_data=NULL;
_len=0
}
Dank...
InformationsquelleAutor der Frage Stef | 2011-01-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter der Annahme, dass diese Werte primitive Typen, dann Nein, da gibt es keinen Unterschied. Initialisierungs-Listen nur einen Unterschied machen, wenn Sie Objekte als Mitglieder hat, da anstelle der Verwendung von Standard-Initialisierung, gefolgt von der Zuordnung, die Initialisierung-Liste können Sie initialisieren das Objekt auf seinen endgültigen Wert. Dieser kann in der Tat spürbar schneller.
InformationsquelleAutor der Antwort templatetypedef
Müssen Sie mit Initialisierungsliste zu initialisieren ständige Mitglieder,Referenzen und "Basisklasse"
Wenn Sie brauchen, um zu initialisieren Konstante, Referenzen und Parameter für die Basisklasse Konstruktoren, wie bereits erwähnt in den Kommentaren, müssen Sie die Initialisierung der Liste.
Beispiel (nicht erschöpfend) Klasse/Struktur enthält die Referenz:
Beispiel und Initialisierung der Basisklasse, die einen parameter benötigt (z.B. kein Standard-Konstruktor):
InformationsquelleAutor der Antwort stefanB
Ja. Im ersten Fall können Sie erklären
_capacity
_data
und_len
als Konstanten:Dies wäre wichtig, wenn Sie wollen, um sicherzustellen
const
-ness dieser Instanz-Variablen während der Berechnung der Werte zur Laufzeit, zum Beispiel:const
Instanzen muss initialisiert werden, die in der Initialisierungsliste oder die zugrunde liegenden Typen müssen public parameterlosen Konstruktoren (primitive Typen).InformationsquelleAutor der Antwort Richard Cook
Werde ich hinzufügen, dass, wenn Sie Mitglieder der Klasse-Typ keine default-Konstruktor zur Verfügung, die Initialisierung ist der einzige Weg, um erstellen Sie Ihre Klasse.
InformationsquelleAutor der Antwort Fred Larson
Ich denke, dieser link http://www.cplusplus.com/forum/articles/17820/ gibt eine ausgezeichnete Erklärung - vor allem für diejenigen, die neu in C++.
Der Grund, warum intialiser-Listen effizienter ist, dass innerhalb des Konstruktors Körper, nur Zuordnungen stattfinden, keine Initialisierung. Also, wenn Sie den Umgang mit non-built-in-Typ, den Standard-Konstruktor für dieses Objekt wurde bereits aufgerufen wird, bevor der Körper des Konstruktors eingegeben wurde. Innerhalb der Konstruktor-Körper, Sie sind zuweisen eines Wertes an das Objekt.
In der Tat ist dies ein Aufruf des default-Konstruktors, gefolgt von einem Aufruf der copy-Zuweisungsoperator. Die initialiser Liste ermöglicht Ihnen das aufrufen der copy-Konstruktor direkt, und dies kann manchmal wesentlich schneller (man erinnere sich, dass die initialiser Liste ist, bevor der Körper des Konstruktors)
InformationsquelleAutor der Antwort user929404
Einen großen Unterschied ist, dass die Zuordnung initialisieren können Mitglieder einer übergeordneten Klasse; die Initialisierung funktioniert nur auf Mitglieder erklärten bei der aktuellen Klasse Anwendungsbereich.
InformationsquelleAutor der Antwort Mark Ransom
Hängt von der Art beteiligt. Der Unterschied ist ähnlich wie zwischen
und
wo die zweite form ist die Initialisierung der Liste - das heißt, es macht einen Unterschied, ob die Art benötigt als argument für den Konstruktor oder effizienter ist, mit Konstruktor-Argumenten.
InformationsquelleAutor der Antwort Puppy
Den wirklichen Unterschied läuft darauf hinaus, wie den gcc-compiler erzeugen Maschinencode, und legen Sie den Speicher. Erklären:
Gibt es sicherlich andere Wege zu handhaben, const Typ Mitglieder. Aber zur Erleichterung Ihres Lebens, den gcc-compiler-Autoren entscheiden, stellen Sie einige Regeln
InformationsquelleAutor der Antwort lukmac
Gibt es nur einen Weg, um initialisieren base-Klassen-Instanzen und nicht-statische member-Variablen, und das ist mit der Initialisierungsliste.
Wenn Sie nicht geben Sie eine Basis-oder nicht-statische member-Variablen im Konstruktor - Initialisierungsliste dann, dass die oder die base wird entweder default-initialisiert (wenn das Mitglied/base-ist eine nicht-POD-Klasse Typ oder ein array von nicht-POD-Klasse-Typen) oder Links auf nicht initialisierte sonst.
Einmal den Konstruktor Körper eingegeben, werden alle Basen oder Mitglieder wird initialisiert wurden oder Links die nicht initialisiert (d.h. Sie haben einen unbestimmten Wert). Es gibt keine Möglichkeit im Konstruktor Körper zu beeinflussen, wie Sie initialisiert werden.
Können Sie in der Lage sein, um neue Werte zuweisen Mitglieder im Konstruktor Körper, aber es ist nicht möglich, zuweisen zu
const
Mitglieder oder der Mitglieder der Klasse-Typ, der die gemacht wurden, nicht übertragbare und es ist nicht möglich, rebind Referenzen.Für eingebaute Typen und benutzerdefinierte Typen, die Zuweisung in den Konstruktor Körper kann genau den gleichen Effekt wie die Initialisierung mit dem gleichen Wert in der Initialisierungsliste.
Wenn Sie sich nicht an Namen, die ein Mitglied oder base in einer Initialisierer-Liste, und diese Entität ist eine Referenz, hat Klasse-Typ mit dem nicht erreichbaren user-deklarierten default-Konstruktor, ist
const
qualifiziert und verfügt über POD-Typ oder eine POD-Klasse Typ oder ein array von POD-Klasse Typ mit einerconst
qualifiziertes Mitglied (direkt oder indirekt), dann das Programm ist schlecht ausgebildet.InformationsquelleAutor der Antwort CB Bailey
Wenn Sie schreiben Sie eine Initialisierungsliste, Sie tun alles in einem Schritt, wenn Sie nicht schreiben Sie eine initilizer Liste, du machst 2 Schritte: eine Erklärung und ein Zeichen für den Wert.
InformationsquelleAutor der Antwort L. Vicente Mangas
Gibt es einen Unterschied zwischen Initialisierung-Liste und Initialisierung-Anweisung in einem Konstruktor.
Betrachten wir folgenden code:
Wenn MyClass eingesetzt wird, werden alle Mitglieder initialisiert werden, bevor die erste Anweisung in einem Konstruktor ausgeführt.
Aber, wenn MyClass2 verwendet wird, alle Mitglieder werden nicht initialisiert, wenn die erste Anweisung in einem Konstruktor ausgeführt.
In späteren Fall, kann es sein, regression problem, wenn jemand einige zusätzliche code in einen Konstruktor vor einem bestimmten Mitglied initialisiert wird.
InformationsquelleAutor der Antwort user928143