Sinn vom Copy Konstruktor ?
-
Hallo,
bin c++ Noob und bin in meinem Buch nur kurz über das Wort COPY Konstruktor gestolpert. Soweit so gut, nur versteh ich einfach nicht den Sinn darin von dem Teil ? Wie und wann wird er benötigt ?
Wär echt toll wenn mir das mal jemand anhand eines Anfänger Beispiels erklären könnte.MfG und schöne Weihnachten.
Cassis. :xmas1:
-
Der Sinn besteht darin, dass viele Klassen für mehr(oder was andres) stehen, als der Speicherplatz ihrer Membervariablen und Methoden.
Ne Klasse, die eine Integer-Zahl kapselt, ist vollkommen ausreichend damit kopiert, dass man den Wert der Integer-Zahl rüberkopiert.
Aber vielleicht steht die Klasse ja z.B. mal für eine geöffnete Datei.
Dann willst du ja nicht das File-Handle kopieren, sondern mit Funktionsaufrufen eine neue Datei über das Betriebsystem erstellen und den Inhalt der Datei kopieren , etc...
-
Cassis schrieb:
Wie und wann wird er benötigt?
Jede Klasse hat einen Kopierkonstruktor. Der wird immer dann aufgerufen, wenn von einer Instanz eine Kopie erstellt wird, z.b. in diesen Fällen:
void f(Object o); Object g() { Object temp; ... return temp; // Wertrückgabe = Kopie } ... Object myObject; Object anotherObject(myObject); // Kopie f(myObject); // Übergabe by Value = Kopie
Wenn man keinen Kopierkonstruktor definiert, tut der Compiler das für einen. Der automatisch generierte Kopierkonstruktor kopiert einfach rekursiv alle Memberobjekte (ggf. über deren Kopierkonstruktor) und Basisklassensubobjekte in die neue Instanz. Manchmal ist das aber nicht das, was man will, siehe z.B. dieses (Nonsens-)Beispiel:
class Test { char *ptr; public: Test() { ptr = new char; } ~Test() { delete ptr; } }; void funktion() (Test t) { /* tut nix */ } int main() { Test t; funktion(t); } // Hier: Crash. Versuch mal selbst herauszufinden wieso, dann weißt du auch wozu man einen Kopierkonstruktor braucht.
Wenn man nicht will, dass eine Klasse kopiert werden kann, deklariert man den Kopierkonstruktor einfach private.
Das gleiche gilt übrigens sinngemäß auch für den Kopier-Zuweisungsoperator.
-
Beim verlassen der Funktion "void funktion() (Test t)" wird der Destruktor aufgerufen, dieser gibt den Speicherplatz auf den der Pointer zeigt wieder frei. Auf diesen Speicherplatz zeigt aber auch das Objekt das in main erstellt wurde ? Oder ?
-
Korrekt.
-
Also sollte der copy-Konstruktor in diesem Fall einen neuen Zeiger erstellen.
-
Nein, besser wäre an dieser Stelle eine Referenz.
-
PuppetMaster2k schrieb:
Nein, besser wäre an dieser Stelle eine Referenz.
Verstehe ich nicht.
Warum Referenz? Damit verbietest du ja das Kopieren, was aber zB bei einem string (welcher zB nur einen char* Kapselt) doch etwas ungut wäre...
-
Oh mann. Hast recht! Ich glaube ich sollte für heute Schluß machen. Ist irgendwie nicht mein Tag heute...