2012-09-27 10 views
5

Und ruft der Standardkopiekonstruktor den Kopierkonstruktor auf allen Mitgliedern auf? Zum Beispiel, wenn eine Klasse ein nicht-POD Mitglied hat in etwa so:Ruft der Standardzuweisungsoperator den Operator = für alle Mitglieder auf?

class A 
{ 
    std::string str; 
}; 

... wird die Standard-Compiler generieren Kopierkonstruktor und Zuweisungsoperator Arbeit richtig? Werden sie den Kopierkonstruktor der Zeichenkette und operator= aufrufen oder werden sie nur eine bitweise Kopie der Elementvariablen str erstellen?

Mit anderen Worten, bedeutet dies mit einem std::string Mitglied diese Klasse benötigt einen Benutzer-implementierten Kopierkonstruktor und Zuweisungsoperator?

Antwort

5

Ja, der vom Compiler erzeugte wird korrekt funktionieren.

Wenn Sie jedoch Ihre eigenen implementieren und sie leer lassen, wird es nicht.

Wenn Sie Speicher nicht verwalten und alle Ihre Mitglieder korrekte Kopieren/Zuweisung/Vernichtung bereitstellen, müssen (und sollten Sie nicht) Ihren eigenen Kopierkonstruktor/Destruktor/Zuweisungsoperator implementieren.

Mit anderen Worten, bedeutet ein Member namens std :: string, dass diese Klasse einen vom Benutzer implementierten Kopierkonstruktor und Zuweisungsoperator benötigt?

Nein, die vom Compiler generierten funktionieren einwandfrei.

+0

"Ja, der vom Compiler erzeugte wird korrekt funktionieren." - auch für Klassen mit konstanten Mitgliedern? –

+0

@ Spin_Eeight dann eine Kopie oder Zuordnung würde nicht einmal kompilieren. –

+3

@LuchianGrigore: Tatsächlich wird eine Kopie kompiliert. Die Aufgabe wird nicht offensichtlich. –