Im Falle, daß Strukturen nur Elemente der eingebauten Typen enthalten, reicht eine bitweise Kopie der Einzelelemente, um eine Kopie der gesamten Struktur zu erstellen. Damit lassen sich solche Objekte auf dem Stack ablegen oder aufeinander zuweisen. Solche einfachen Klassen oder Strukturen kann man daher bereits an Unterprogramme übergeben oder als Resultate zurückerhalten.
class POD { // POstal Data public: int a; double b; }; POD do_something(POD p){ // call copy ctor in POD p to create the copy // do something with p, return changed p return p; // copy ctor called in return, then // dtor called on p }
Für solche Fälle stellt der Compiler einen
Default-Kopier-Kontruktor bereit, der im Falle solcher traditioneller
Strukturen bitweise Kopien anfertigt. Für benutzerdefinierte Klassen
bewirkt der compilergenerierte Kopierkonstruktor den Aufruf aller
Kopierkonstruktoren der Datenelemente der Klasse in der Reihenfolge
ihrer Deklaration. Damit ist z.B. unsere Person
einwandfrei zu
kopieren, obwohl zwei Datenelemente sogar benutzerdefinierte Klassen
sind. Typische Fällen, in denen der generierte Kopierkonstruktor nicht
ausreicht, sind solche, in denen bereits der reguläre Konstruktor die
Anforderung einer Resource vornahm, etwa dynamisch Speicherplatz
anforderte oder eine Datei öffnete.
Ähnliche Überlegungen gelten für die Zuweisung. Auch hier stellt der Compiler einen Zuweisungsoperator bereit, der seinerseits die Zuweisungsoperatoren der Datenelemente der Klasse aufruft. Auch dieser ist in der Regel nur dann nicht mehr ausreichend, wenn in den Konstruktoren ungewöhnliche Resource angefordert werden.