Konstruktoren/Destruktoren !?!



  • Hey leute kann mir mal bitte einer ganz einfach und mit verständlichen Worten erklären ...welche Aufgabe diese beiden haben ..

    Irgendwie wird mir der Sinn nicht richtig klar ..

    thx 🙂



  • Die Augenscheinlichen Sachen stehen eh in dem Buch, was Du gerade liest.
    Aber es zielt auf RAII http://de.wikipedia.org/wiki/Ressourcenbelegung_ist_Initialisierung, das macht glücklich.



  • Ein Konstruktor wird verwendet, um bestimmte Aktionen wie initialisieren von Membervariablen der Klasse durchzufuehren. Konstruktoren verhalten sich wie Funktionen, man kann ihnen Parameter uebergeben und die Klasse macht dann etwas damit. Zusaetzlich gibt es noch Kopierkonstruktoren, die benoetigt werden, wenn man Kopien von Objekten anfertigt und man dynamischen Speicher reserviert hat.
    Der Konstruktor wird beim erstellen eines Objektes aufgerufen.

    Der Destruktor ist eine spezielle Klassenfunktion, welche beim vernichten des Objekts aufgerufen wird. Man kann ihn zum Beispiel dazu verwenden, um vorher reservierten Speicher im Objekt wieder freizugeben. Ausserdem kann ein Destruktor keine Parameter uebernehmen.

    Jede Klasse enthaelt ausserdem einen Standardkonstruktor/-destruktor, sofern man keinen eigenen implementiert hat.



  • Die beiden Elementfunktionen werden, wie die Namen es sagen, implizit dann aufgerufen, wenn ein Objekt erzeugt (z.B. mit new, auf dem Stack, als Basisklassenaufruf usw.) bzw. zerstört wird (per delete, Stack-Unwinding usw. usf.) Damit sind die beiden Funktionen prädestiniert, sich um Initialisierungs- und Aufräumarbeiten zu kümmern. Ein Beispiel:

    class a {
    private:
    	resource *handle;
    
    public:
    	car() {
    		std::cout << "Ich werde erzeugt" << std::endl;
    		handle = new resource;
    	}
    
    	~car() {
    		std::cout << "Ich werde zerstoert" << std::endl;
    		delete handle;
    	}
    };
    
    {
    	a var1; // Ausgabe: Ich werde erzeugt
    	a* var2 = new a; // Ausgabe: Ich werde erzeugt
    	delete var2; // Ausgabe: Ich werde zerstoert
    } // Ausgabe von var1: Ich werde zerstoert. Am Ende eines Blocks werden normale Stack-Variablen freigegeben, und dabei wird der Destruktor aufgerufen
    

    Mit dieser kleinen Abstraktion erspart man sich bereits Resourcen/Speicherlecks. Ein weiterer Vorteil des Konstruktors ggü. der allgemein bekannten "init()-Methode" ist die Element-Initialisierungsliste (sehr wichtig für Vererbung). Ließ einfach noch ein paar Seiten weiter.



  • Ad aCTa schrieb:

    Ließ


Log in to reply