Vorteile von Initialisierungslisten
Was ich weiß, von Vorteile der Verwendung von Initialisierungs-Liste ist, dass Sie die Effizienz bei der Initialisierung der Klasse Mitglieder, die nicht build-in. Zum Beispiel,
Fred::Fred() : x_(whatever) { }
ist vorzuziehen,
Fred::Fred() { x_ = whatever; }
wenn x ein Objekt einer benutzerdefinierten Klasse. Andere als die, dieser Stil wird verwendet, auch mit built-in-Typen für die Kohärenz.
Die häufigste Vorteil dabei ist die verbesserte performance. Wenn der Ausdruck was auch immer, ist die gleiche Art als member-variable x_, das Ergebnis von dem, was Ausdrucks konstruiert wird, direkt innerhalb von x_ — nicht der compiler machen Sie eine separate Kopie des Objekts.
Mit den anderen Stil, der Ausdruck, was bewirkt, dass ein separates, temporäres Objekt erstellt werden, und dieses temporäre Objekt übergeben wird in der x_-Objekt ist ein Zuweisungsoperator. Dann wird das temporäre Objekt zerstört am ;. Das ist ineffizient.
Frage
Gibt es irgendein Effizienzgewinn im folgenden Beispiel wird mit der Initialisierung der Liste.
Ich denke, es ist kein Gewinn. Die erste version Aufrufe von string copy-Konstruktor und der andere ruft Zeichenfolge Zuweisungsoperator (es gibt keinen temporären thats erstellt). Es das richtig?
class MyClass
{
public:
MyClass(string n):name(n) { }
private:
string name;
};
class MyClass
{
public:
MyClass(string n)
{
name=n;
}
private:
string name;
};
InformationsquelleAutor der Frage Ankur | 2009-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die zweite version ist der Aufruf string ist default-ctor und dann string s copy-Zuweisungsoperator -- es könnte durchaus sein, (kleinere) Wirkungsgrad-Verluste im Vergleich zu den ersten, die direkt ruft c ' s copy-ctor (z.B., je nach string-Implementierung, es könnte sinnlos sein, Zuteilung-dann-Freigabe von ein paar winzigen Struktur). Warum nicht nur verwenden Sie immer den richtigen Weg?-)
InformationsquelleAutor der Antwort Alex Martelli
Ich denke, der einzige Weg zum initialisieren von const-Datenelemente ist in der Initialisierungs-Liste
ZB. in der Kopfzeile:
Und die in der cpp-Datei:
InformationsquelleAutor der Antwort pxb
Es ist eine großartige Art und Weise zu initialisieren Mitglieder :
InformationsquelleAutor der Antwort Maciek
Daran erinnern, dass es einen deutlichen Unterschied zwischen einem kopierkonstruktor und ein Zuweisungsoperator:
Also in Ihrem zweiten Beispiel, einige arbeiten bereits getan hat, zu erstellen
name
durch die Zeit, dieerreicht ist.
Jedoch, es ist durchaus möglich (gerade in diesem einfachen Beispiel), dass die Arbeit getan ist, ist verschwindend gering (wohl nur anschießen einige Mitglieder-Daten in der
string
- Objekt) und, dass die Arbeit optimiert ist, ganz Weg zu einer optimierten bauen. aber es ist immer noch gut in form als zu verwenden Initialisierer-Listen Wann immer möglich.InformationsquelleAutor der Antwort Michael Burr
Unten sind die Szenarien, wenn Initialisierungsliste verwendet:
InformationsquelleAutor der Antwort fox
Können wir auch die Konstruktor-delegation über die Initialisierungs-Liste.
InformationsquelleAutor der Antwort Pranav Jain