Kopieren von Klassenobjekten
Objekte können sowohl mit dem Zuordnungsvorgang als auch dem Initialisierungsvorgang kopiert werden.
Zuordnung: Wenn der Wert eines Objekts einem anderen Objekt zugewiesen wird, wird das erste Objekt in das zweite Objekt kopiert. Daher eignet sich
Point a, b; ... a = b;
dazu, den Wert von b nach a zu kopieren.
Initialisierung: Die Initialisierung erfolgt zum Zeitpunkt der Deklaration eines neuen Objekts, wenn Argumente an Funktionen nach Wert übergeben werden und wenn Werte von Funktionen nach Wert zurückgegeben werden.
Sie können die Semantik von "kopieren" für Objekte des Klassentyps definieren. Betrachten Sie beispielsweise folgenden Code:
TextFile a, b;
a.Open( "FILE1.DAT" );
b.Open( "FILE2.DAT" );
b = a;
Der vorhergehende Code kann "Den Inhalt von FILE1.DAT auf FILE2.DAT kopieren" oder "FILE2.DAT ignorieren und b als zweiten Ziehpunkt für FILE1.DAT erstellen" bedeuten. Jeder Klasse muss wie folgt eine entsprechende Kopiersemantik beigefügt werden.
Durch Verwendung des Zuweisungsoperators operator= mit einem Verweis auf den Klassentyp als Rückgabetyp und den Parameter, der vom const-Verweis übergeben wird, beispielsweise ClassName& operator=(const ClassName& x);.
Durch Verwendung des Kopierkonstruktors. Weitere Informationen über den Kopierkonstruktor finden Sie unter Regeln zum Deklarieren von Konstruktoren.
Falls Sie keinen Kopierkonstruktor deklarieren, generiert der Compiler einen Member-basierten Kopierkonstruktor für Sie. Falls Sie keinen Kopierzuweisungsoperator deklarieren, generiert der Compiler einen Member-basierten Kopierzuweisungsoperator für Sie. Das Deklarieren eines Kopierkonstruktors unterdrückt nicht den vom Compiler generierten Kopierzuweisungsoperator (und umgekehrt). Wenn Sie einen implementieren, sollten Sie auch den anderen implementieren, damit die Codebedeutung eindeutig ist.
Die Member-basierte Zuweisung wird in Memberweise Zuweisung und Initialisierung behandelt.
Der Kopierkonstruktor nutzt ein Argument des Typs class-name**&**, wobei class-name für den Namen der Klasse steht, für die der Konstruktor definiert ist. Beispiel:
// spec1_copying_class_objects.cpp
class Window
{
public:
Window( const Window& ); // Declare copy constructor.
// ...
};
int main()
{
}
Hinweis
Nutzen Sie soweit möglich für den Kopierkonstruktor den Argumenttyp const class-name&.Dadurch wird verhindert, dass der Kopierkonstruktor fälschlicherweise das Objekt ändert, aus dem er kopiert.Zudem wird auch das Kopieren von const-Objekten ermöglicht.