Von Klassen, Konstruktoren und Destruktoren ...
-
hey.
Nach mehrmaligem studieren der entsprechenden Seiten meines C++ - Buches (es handelt sich um "C++ lernen und professional anwenden", Peter Prinz & Ulla Kirch-Prinz) habe ich leider immer noch nicht die Thematik der Klassen, und was es mit den Konstruktoren und Destruktoren auf sich hat, verstanden.
Ich rede hier nicht von der Syntax, es geht einfach nur um das grundsätzliche Verständnis.
Vielleicht kann mir ja dabei jemand unter die Arme greifen?
Schonmal danke im voraus,
Grüße
-
Der Konstruktor ist eine Funktion die aufgerufen wird, sobald du ein Objekt von der Klasse anlegst. Der Destruktor wird aufgerufen wenn dieses Objekt wieder entfernt wird (zB weil das Programm zu Ende ist, etc.)
MfG SideWinder
-
Danke erst mal für die schnelle Antwort!
Stimmt es, das der Destruktor einfach nur den Speicherplatz des Objekts freigibt, wenn dieses entfernt wird?
Soweit kann ich dir folgen, nur, was ist die genaue Aufgabe des Konstruktors? (Bei einfachen Übungen hab ich keinen Konstruktor verwendet,... hat auch prima funktioniert
)Weiters hab ich ein Problem dabei, mir vorzustellen wie Klassen überhaupt in der Praxis eingesetzt werden. (Die Buch-Beispiele PKW und Konto konnten mich leider auch nicht erleuchten)
Grüße
-
Hallo,
nein, der Destruktor wird aufgerufen, wenn ein Objekt zerstört wird, nicht mehr und nicht weniger. Speicher wird erstmal nicht freigegeben, was aber auch nicht sein muss. Was der Destruktor für Aufräumarbeiten erledigen muss, hängt von dem Aufbau der Klasse ab.
-
also d.h. wenn zb. in der klasse dateien geöffnet werden, werden diese durch den destruktor wieder geschlossen sofern sie nicht mehr benötigt werden?
ich glaub ein kleines theoretisches beispiel was ein konstruktor an aufgaben haben könnte, würde mir sehr weiter helfen ...Grüße
-
Hi,
Platon schrieb:
also d.h. wenn zb. in der klasse dateien geöffnet werden, werden diese durch den destruktor wieder geschlossen sofern sie nicht mehr benötigt werden?
Nein, nur wenn du dem Destruktor sagst, dass er das tun soll. Ansonsten tut der erstmal gar nix. Wenn du nix mit new allozierst (sh. u.) dann muss auch nix explizit freigegeben werden werden.
ich glaub ein kleines theoretisches beispiel was ein konstruktor an aufgaben haben könnte, würde mir sehr weiter helfen ..
Naja, also wenn du z. B. ein Objekt erzeugst, bei dem es einfach keinen Sinn macht, es ohne Defaultwerte existieren zu lassen, kannst du ihm im Konstruktor einen Defaultwert zuweisen lassen. Wahrscheinlich meintest du aber eher den Destruktor...
Ein Destruktor wird benötigt, wenn du in deinem Objekt Speicher allozierst (mit "new"). Dann muss der Destruktor, der ja aufgerufen wird, wenn das Objekt zerstört wird, den mit delete wieder freigeben.
-
Zusammenfassend kann man also sagen:
Konstruktoren Versehen Variablen des Objekts mit passenden Startwerten, sofern benötigt und erfüllen weiter zur späteren verwendung des Objekts nötige Aufgaben aus, während Destruktoren Das Objekt zerstören und vorher, falls gewünscht, die durch die Konstruktoren ausgeführten Aufgaben rückgängig machen und, falls explizit mit delete angegeben, den Speicher freigeben?Stimmt das soweit?
Kann man allgemein definieren, was der Sinn der Verwendung von Klassen ist? Nachdem ich noch am lernen bin fehlt mir leider die Praxis, d.h.: ich kann die theorie "Klassen" nicht umsetzten... (Habt bitte geduld mit mir! ich bin eben ein zufußgeher
)Grüße
-
Hallo,
ne, die Formulierungen sind nicht ganz richtig:
Konstruktoren Versehen Variablen des Objekts mit passenden Startwerten, sofern benötigt und erfüllen weiter zur späteren verwendung des Objekts nötige Aufgaben aus, während
Ein Konstruktor wird aufgerufen, wenn ein Objekt erzeugt wird. Was der Konstruktor im Einzelnen macht, ist nicht festgelegt. Sinnvoll ist es eben, beispielsweise Startwerte o.ä. zu vergeben.
während Destruktoren Das Objekt zerstören und vorher, falls gewünscht, die durch die Konstruktoren ausgeführten Aufgaben rückgängig machen und, falls explizit mit delete angegeben, den Speicher freigeben?
Ein Objekt wird zerstört. Die Art und Weise ist erstmal egal (automatisch oder durch Aufruf von delete). Der Destruktor wird aufgerufen, und was der macht, ist auch nicht vorgegeben. Ich kenne dein Buch nur vom Namen her, aber ich denke, dass solche elementaren Dinge durchaus geklärt werden.
Kann man allgemein definieren, was der Sinn der Verwendung von Klassen ist? Nachdem ich noch am lernen bin fehlt mir leider die Praxis, d.h.: ich kann die theorie "Klassen" nicht umsetzten...
Vielleicht hilft dir das weiter:
http://de.wikipedia.org/wiki/ObjektorientierungAnsonsten hier mal etwas rumwühlen, ist mit Sicherheit recht hilfreich.
-
naja. die aufgabe der konstruktoren und destruktoren ist im prinzip nur dem programmierer der klasse eine möglichkeit zu geben auf das zerstören, bzw. erstellen von objekten der klasse zu reagieren.
es ist zwar allgemein üblich, dass man den konstruktor dazu benutzt variablen mit startwerten zu initialisieren, aber das muss immernoch explizit programmiert werden (eben in die constructor-funktion).
das selbe gilt für den destruktor. auch er löscht nichts von selber. er wird eben nur aufgerufen, falls das objekt per delete gelöscht wird (oder am programmende). alloziierten speicher muss man wieder selber freigeben.class Blub { private: Bla* _bla; int neo; public: Blub() : neo(21) { _bla = new Bla(); }; virtual ~Blub() { delete _bla; }; };
-
Wikipedia ist auf jeden Fall ne gute idee. danke für den tip. Das ich auch selbst nicht darauf gekommen bin *mich schäm*.
Ich denke, ich werd das mal genauer unter die lupe nehmen und dann nochmal mein buch zu rate ziehen. wer weis, vielleicht überreiß ichs diesmal...Vielen dank für die Hilfe!