IMHO, vorhandene Antworten machen einen schlechten Job und erklären das "Warum" davon - konzentrieren sich zu sehr darauf, zu wiederholen, welches Verhalten gültig ist. "Zugriffsmodifikatoren funktionieren auf Klassenebene und nicht auf Objektebene." - Ja aber warum?
Das übergeordnete Konzept hier ist, dass es die Programmierer sind, die eine Klasse entwerfen, schreiben und pflegen, von denen erwartet wird, dass sie die gewünschte OO-Kapselung verstehen und befugt sind, ihre Implementierung zu koordinieren. Wenn Sie also schreiben class X
, codieren Sie nicht nur, wie ein einzelnes X x
Objekt von Code mit Zugriff darauf verwendet werden kann, sondern auch wie:
- abgeleitete Klassen können damit interagieren (durch optional reine virtuelle Funktionen und / oder geschützten Zugriff) und
- Verschiedene
X
Objekte arbeiten zusammen , um beabsichtigte Verhaltensweisen bereitzustellen und gleichzeitig die Nachbedingungen und Invarianten Ihres Entwurfs zu berücksichtigen.
Es ist nicht nur der Kopierkonstruktor - eine Vielzahl von Operationen kann zwei oder mehr Instanzen Ihrer Klasse umfassen: Wenn Sie vergleichen, addieren / multiplizieren / dividieren, kopieren, klonen, zuweisen usw., ist dies häufig der Fall Entweder muss es einfach Zugriff auf private und / oder geschützte Daten im anderen Objekt haben oder es soll eine einfachere, schnellere oder allgemein bessere Funktionsimplementierung ermöglichen.
Insbesondere möchten diese Vorgänge möglicherweise den privilegierten Zugriff nutzen, um Folgendes zu tun:
- (Kopierkonstruktoren) verwenden ein privates Mitglied des Objekts "rhs" (rechte Seite) in einer Initialisiererliste, sodass eine Mitgliedsvariable selbst kopierkonstruiert wird, anstatt standardmäßig konstruiert (wenn auch legal) und dann ebenfalls zugewiesen (erneut) falls legal)
- Ressourcen gemeinsam nutzen - Dateihandles, Segmente für gemeinsam genutzten Speicher,
shared_ptr
s zum Referenzieren von Daten usw.
- Dinge in Besitz nehmen, z
auto_ptr<>
"verlagert" das Eigentum an dem im Bau befindlichen Objekt
- Kopieren Sie private "Cache" -, Kalibrierungs- oder Statuselemente, die erforderlich sind, um das neue Objekt in einem optimal verwendbaren Zustand zu erstellen, ohne sie von Grund auf neu generieren zu müssen
- Kopier- / Zugriffsdiagnose- / Ablaufverfolgungsinformationen, die in dem zu kopierenden Objekt gespeichert sind und auf die sonst nicht über öffentliche APIs zugegriffen werden kann, die jedoch möglicherweise von einem späteren Ausnahmeobjekt oder einer Protokollierung verwendet werden (z. B. Angaben zu Zeitpunkt / Umständen, zu denen die "ursprüngliche" nicht kopierte Instanz erstellt wurde wurde errichtet)
- Führen Sie eine effizientere Kopie einiger Daten durch: z. B. können Objekte z. B. ein
unordered_map
Mitglied haben, aber nur öffentlich verfügbar machen begin()
und end()
iterieren - mit direktem Zugriff auf size()
Sie können Sie reserve
schneller kopieren. Schlimmer noch, wenn sie nur aussetzen at()
und insert()
und sonst throw
....
- Kopieren Sie Verweise zurück auf übergeordnete / Koordinations- / Verwaltungsobjekte, die für den Clientcode möglicherweise unbekannt oder schreibgeschützt sind