Vorteile von Initialisierungslisten

Was ich von den Vorteilen der Verwendung der Initialisierungsliste weiß, ist, dass sie die Effizienz beim Initialisieren von Klassenmitgliedern erhöhen, die nicht integriert sind. Zum Beispiel,

Fred::Fred() : x_(whatever) { }

ist vorzuziehen,

Fred::Fred() { x_ = whatever; }

wenn x ein Objekt einer benutzerdefinierten Klasse ist. Davon abgesehen wird dieser Stil aus Gründen der Konsistenz auch bei integrierten Typen verwendet.

Der häufigste Vorteil dabei ist eine verbesserte Leistung. Wenn der Ausdruck whatever vom selben Typ ist wie die Elementvariable x_, wird das Ergebnis des Ausdrucks whatever direkt in x_ erstellt - der Compiler erstellt keine separate Kopie des Objekts.

Beim anderen Stil wird der Ausdruck, der zur Erzeugung eines separaten temporären Objekts führt, und dieses temporäre Objekt wird an den Zuweisungsoperator des x_-Objekts übergeben. Dann wird das temporäre Objekt am; zerstört. Das ist ineffizient.

Frage
Gibt es im folgenden Beispiel einen Effizienzgewinn bei Verwendung der Initialisierungsliste? Ich denke, es gibt keinen Gewinn. Die erste Version ruft den Kopierkonstruktor der Zeichenfolge und den Zuweisungsoperator der anderen Zeichenfolge auf (es werden keine temporären Elemente erstellt). Ist das richtig?

class MyClass
{
public:
    MyClass(string n):name(n) { }
private:
    string name;
};

class MyClass
{
public:
    MyClass(string n)
    {
        name=n;
    }
private:
    string name;
};

Antworten auf die Frage(6)

Ihre Antwort auf die Frage