2016-06-05 5 views
3

Alle Menschen erinnern uns an den Fall, wenn Sie Standard-Kopierkonstruktor und Standard-Zuweisungsoperator verwenden, seien Sie vorsichtig, da sie Schattenkopie sind. Allerdings bin ich immer verwirrt, warum nicht standardmäßig tief Kopie zwischen Standard-Kopierkonstruktor und Standard-Zuweisungsoperator in C++ machen, so dass niemand ihre eigene Kopierkonstruktor-Implementierung schreiben muss, um jeden Unfall zu verhindern?Warum nicht tiefe Kopie im Standard-Kopierkonstruktor implementieren?

+2

Wenn Sie Container-Mitglieder haben (zB. 'Std :: vector',' std :: map', 'std :: list', usw.), ist das Standardverhalten deep copy. Verwenden Sie keine rohen Zeiger als Mitglieder, es sei denn, Sie möchten eine flache Kopie erstellen. –

+5

Wenn Sie eine Membervariable haben, die ein Zeiger ist, woher weiß der Compiler, worauf er hinweist und wie groß dieser Speicher ist? Wenn der Compiler das nicht erkennen kann, kann er nicht tief kopieren. –

+0

Sie sind nicht "Schattenkopie". Sie kopieren nur die Mitglieder. Das ist es. Wenn dies nicht Ihren Anforderungen entspricht, müssen Sie Ihre eigene Kopie und Zuweisung implementieren. – juanchopanza

Antwort

9

C++ implementieren Kopie nach Wert, was bedeutet, dass es im Grunde x = y;. In vielen Fällen ist das genug.

Im Fall von Zeigern weiß der Compiler jedoch nichts darüber, worauf verwiesen wird. Es wird den Wert des Zeigers kopieren, das zugrundeliegende Element wird jedoch nicht dupliziert. Zum Beispiel haben, wenn Sie eine Klasse wie folgt bekommen:

class Foo 
{ 
    char *data; 
}; 

Was dann sollte der Compiler mit data tun? Es weiß nicht, ob es auf einen einzelnen char oder ein Array von char zeigt. Es weiß nichts darüber, wie der Speicher zugewiesen wurde oder wie er freigegeben werden sollte. Es weiß nicht, ob es eine Kopie erstellen soll oder ob alle Instanzen von Foo auf dieselbe Instanz verweisen sollen.

Aus diesem Grund nimmt die Sprache eine vollkommen vernünftige Standardposition ein, nämlich dass nur der Wert des Zeigers kopiert wird. Wenn Sie etwas mehr wollen, müssen Sie es selbst tun, da nur Sie den Anwendungsfall der Variablen vollständig verstehen.

+1

großartige Erklärung! – lulyon

Verwandte Themen