Konstruktoren eine spezielle Form von Methoden gleicher Name wie Klasse kein Rückgabewert Aufgabe: Instanzen einrichten (konstruieren), Anfangswerte setzen, Werte übernehmen, an Instanzvariablen übergeben
Konstruktoren wenn kein Konstruktor definiert, dann Standardkonstruktor (ohne spezielle Funktionalität) mehrere Konstruktoren mit unterschiedlichen und mehreren Parametern möglich dadurch verschiedene Instanziierungen von Objekten möglich Zeiger für Attribute sind möglich und vorteilhaft; dynamische Allokierung muss public sein
Beispiel: class mensch public: mensch() }; } // Konstruktor alter = 0; // name = Meier ; geht nicht; WH: Zeiger
deshalb: class mensch int alter; char *name; char *geb; void geburtstag(int); public: }; // Zeiger // Zeiger // Deklaration void geburtstag(); // Deklaration mensch(); // Deklaration Konstruktor 1 mensch(char*, int); // Deklaration Konstruktor 2
// besser innnerhalb der Klasse definieren mensch :: mensch() // Definition name = new char[20]; // dynamische Allokierung geb = new char[11]; name = Meier ; // Zuweisung nun möglich geb = 01.04.1981 ; alter = 23; }
mensch :: mensch(char *n, int a) // Definition name = new char[20]; // dynamische Allokierung geb = new char[11]; name = n; // Zuweisung nun möglich geb = 01.04.1981 ; alter = a; }
Instanzbildung: // statisches Instanziieren mensch meier; // mit Konstruktor 1 mensch mueller( Mueller, 34); // mit Konstruktor 2 // dynamisches Instanziieren // mit Konstruktor 2 mensch *heinz = new mensch( Kurt, 52); mensch *hans = new mensch(); // mit Konstruktor 1
Zugriff: meier.ausgabe(); // u.a. Meier, 23 mueller.ausgabe(); // u.a. Müller, 34 heinz[0].ausgabe(); // u.a. Kurt, 52 hans[0].ausgabe(); // u.a. Meier, 23 heinz[1].ausgabe(); // zufällig, sinnlos Aber: heinz[1].eingabe(); // Werte eingeben heinz[1].ausgabe(); // eingegebene Werte
zum Aufräumen nach Ende der Nutzung von Objekten nach Verlassen des Programms (statische Objekte) bzw. mit delete (dynamische Objekte) z.b. delete hans; delete heinz; eine spezielle Form von Methoden gleicher Name wie Klasse vorangestelltes Tildezeichen ~
verfügen weder über Parameter noch über einen Rückgabewert genau ein Destruktor pro Klasse wenn kein Destruktor definiert, dann Standarddestruktor (ohne spezielle Funktionalität) muss public sein
deshalb: class mensch int alter; char *name; char *geb; void geburtstag(int); public: void geburtstag(); }; // Zeiger // Zeiger // Deklaration // Deklaration mensch(); // Deklaration Konstruktor 1 mensch(char*, int); // Deklaration Konstruktor 2 ~mensch(); // Deklaration Destruktor
besser innnerhalb der Klasse definieren ~mensch :: mensch() // Definition // natürlich fstream.h einbinden ofstream fout( daten.dat", ios::app); fout << art << '\t' << farbe << '\t' << pflanzzeit << '\t' << groesse << '\n'; fout.close(); cout << "alle Daten gespeichert!\n"; }
Darstellung mit UML - alter : int mensch - name : char[20] - geb : char[11] + mensch() + mensch(char*, int) + ~mensch() + eingabe() - geburtstag(int) + geburtstag() 3.3 Konstruktoren und Klassenname Elementvariablen Standardkonstruktor 2. Konstruktor Destruktor Methoden - private + public