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?
Antwort
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.
großartige Erklärung! – lulyon
- 1. Tiefe Kopie eines Drawable
- 2. tiefe Kopie der Doktrin
- 3. Flache Kopie und tiefe Kopie in C
- 4. R: tiefe Kopie ein Funktionsargument
- 5. Wie man manuell eine tiefe Kopie
- 6. tiefe Kopie Fehler, wenn benutzerdefiniertes Kopieren Objekt
- 7. Erstellt Gorutine eine tiefe Kopie oder flache Kopie?
- 8. Gibt listIterator.next() tiefe Kopie oder flache Kopie zurück?
- 9. Standardvektor C++ - tiefe oder flache Kopie
- 10. wie eine tiefe Kopie meiner Liste machen
- 11. C tiefe Kopie Struktur mit Zeiger
- 12. Tiefe Kopie von "xml_document" in pugixml "Clone"
- 13. Führt Enumerable.Repeat() eine tiefe Kopie durch?
- 14. Tiefe Kopie von 2D-Array in Scala?
- 15. Mein RCP-Client gibt keine tiefe Kopie eines Objekts zurück
- 16. Warum sollte ich ICloneable in C# implementieren?
- 17. Wie man eine "tiefe" Kopie einer Funktion macht - Javascript
- 18. tiefe Kopie der Struktur mit Pointer Point in C
- 19. Entity Framework 6 tiefe Kopie/Klon einer Entität mit dynamischer Tiefe
- 20. Gibt mir ein Schneidevorgang eine tiefe oder flache Kopie?
- 21. Klon Methode für Array eine tiefe oder eine flache Kopie?
- 22. Tiefe Kopie eines Arrays in Angular 2 + TypeScript
- 23. Gibt LINQ eine tiefe Kopie einer Sammlung zurück?
- 24. Führt Arrays.copyOf eine seichte oder eine tiefe Kopie?
- 25. Führt Scala AnyRef.clone eine seichte oder tiefe Kopie aus?
- 26. Tiefe Kopie bei der Verwendung von ArrayList in Java
- 27. Erstellen Sie QImage aus Puffer, keine tiefe Kopie?
- 28. Wie kann ich ein Objekt (tiefe Kopie) in Dart klonen?
- 29. Wie man eine tiefe Kopie eines InputStream in Java macht
- 30. Warum Struktur flache Kopie nicht funktioniert?
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. –
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. –
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