Warum Kopierkonstruktor und Zuweisungsoperator nicht erlaubt sind?

7
%Vor%

Ich lese Open-Source-Code von Google. Warum sind Kopierkonstruktor und Zuweisungsoperator nicht erlaubt?

    
MainID 06.08.2010, 08:30
quelle

3 Antworten

12

Um zu verhindern, dass Instanzen der Klasse kopiert oder zugewiesen werden. Die meisten Klassen sollten das Kopieren nicht erlauben. Betrachten Sie zum Beispiel eine BankAccount-Klasse - wenn Sie Software für eine Bank schreiben, werden sie nicht allzu glücklich sein, wenn Sie Kopien von Konten erstellen und dann Gutschriften und Belastungen auf diese verschiedenen Kopien anwenden.

    
anon 06.08.2010, 08:32
quelle
7

Das Problem mit dem Kopierkonstruktor und dem Kopierzuweisungsoperator besteht darin, dass der Compiler Implementierungen automatisch generiert, wenn sie nicht explizit deklariert sind.

Dies kann leicht zu unbeabsichtigten Problemen führen. Wenn eine Klasse einen nicht-trivialen Destruktor hat, muss sie fast immer eigene Implementierungen für den Kopierkonstruktor und den Kopierzuweisungsoperator bereitstellen (dies ist das Gesetz der Big Three ), da die vom Compiler generierten Standards normalerweise das Falsche tun.

Die Verletzung des Gesetzes der Großen Drei führt oft zu Fehlern wie Doppelfreigaben von Datenmitgliedern und Speicherkorruption. Es kommt nicht selten vor, dass diese Art von Fehlern auftritt, weil der Autor der Klasse sich nie Gedanken über das Kopierverhalten gemacht hat und es für den Verbraucher leicht ist, Objekte unbeabsichtigt zu kopieren.

Wenn der Autor der Klasse nicht wirklich darüber nachgedacht hat, Instanzen dieser Klasse richtig zu kopieren (oder die Klasse einen trivialen Destruktor hat), ist es besser, das Kopieren explizit zu verbieten, um mögliche Probleme zu vermeiden. Die Implementierung der Kopierbarkeit könnte dann aufgeschoben werden, bis ein tatsächlicher Bedarf dafür besteht.

    
jamesdlin 06.08.2010 09:25
quelle
1

Wenn Ihr Typ Zeiger oder Referenzelemente enthält oder keinen semantischen Sinn hat, damit er kopiert werden kann (z. B. ein Ressourcen-Handle, das im Destruktor freigegeben werden muss), empfiehlt es sich, den Kopierkonstruktor und die Zuweisung zu deaktivieren Operator. In C ++ 0x (z. B. in g ++ 4.4 oder höher im -std = C ++ 0x-Modus) können Sie sie als gelöscht deklarieren. In älteren Compilern deklarieren Sie sie nur als privat und nicht implementiert.

    
Anthony Williams 06.08.2010 08:38
quelle

Tags und Links