Weil besser als gut!

Konstruktoren (C++)Inhaltsverzeichnis
StandardkonstruktorProgrammbeispiel (Konstruktoren)[...] C++ #include <iostream> using namespace std; /** * Maus * Eine Klasse ohne Konstruktor */ class Maus { private: int alter; public: int getAlter() { return alter; } }; /** * Loewe * Eine Klasse mit einem Konstruktor */ class Loewe { private: int alter; public: Loewe(); int getAlter() { return alter; } }; // Klassendefinition sollte in eigene Datei geschrieben werden! Loewe::Loewe() { alter = 42; } void main() { Maus klaus; // Aufruf des Konstruktors cout << klaus.getAlter() << endl; Loewe uwe; // Aufruf des Konstruktors cout << uwe.getAlter() << endl; } Ausgabe der Release-Version... 1 // Warum, ist nicht klar... 42 // Wie definiert. Parameter
Beispiele, KonstruktortypenC++ // 1. Konstruktor Mitarbeiter(); // 2. Konstruktor Mitarbeiter( string name, string vorname, int alter ); // 3. Konstruktor Mitarbeiter( short schuhgr, string name = "Petersen", string vorname = "Peter" ); // 4. Konstruktor Mitarbeiter( int alter );
Mögliche InstanziierungenFolgende Instanziierungen sind jetzt möglich: C++ // 2. Konstruktor, expl. Aufrufform Mitarbeiter franz = Mitarbeiter( "Schulze", "Franz", 55 ); // 2. Konstruktor, impl. Aufrufform Mitarbeiter josef( "Meier", "Josef", 33 ); // 3. Konstruktor, impl. Aufrufform Mitarbeiter max( 47, "Riesig" ); // 4. Konstruktor, impl. Aufrufform Mitarbeiter bert( 40 ); // 4. Konstruktor, Sonderform des Aufrufs bei 1 Parameter Mitarbeiter fritz = 65; // Default-Konstruktor Mitarbeiter* zm = new Mitarbeiter; Objekte als FeldelementeWerden Felder mit Objekten angelegt, so erfordert dies meistens die Existenz des Standard-Konstruktors - es sei denn, alle Elemente werden explizit mit einem anderen Konstruktor angelegt. C++ Mitarbeiter team01[10]; Mitarbeiter team02[4] = { Mitarbeiter("Finn", "Huck", 18 ), Mitarbeiter("Croft", "Lara", 19 ), Mitarbeiter("Max", "Moritz", 20 ) }; Für team01 wird der Standard-Konstruktor 10-mal benötigt, für team02 einmal (für das letzte Element). Optimierung mit init()-MethodeDer untenstehende Code zeigt anhand eines Beispiels, wie man mehrere Konstruktoren effizient mithilfe einer Methode init() vereinfachen kann. Der Name der Methode init() ist frei wählbar! C++ // constr.cpp /** * Man stelle sich hier die ganzen Kopf-Informationen vor... */ class Buch { private: string titel; string autor; int seitenzahl; float preis; void init(); int quatsch(); public: Buch(); Buch( string Titel ); Buch( int seitenzahl ); Buch( float Preis, int Seitenzahl = 777 ); Buch( string Autor, float Preis, string Titel = "BlaBla", int Seitenzahl = 1111 ); }; // private Funktion init() füllt die Variablen mit Standardwerten. void Buch::init() { titel = "Alle meine Enten"; alter = "Donald Duck"; seitenzahl = 42; preis = 42.0f; } int Buch::quatsch() { // erzeugt für ein Buch eine (wahrscheinlich) eindeutige Prüfsumme. Vielleicht. return (title + autor).Length() + seitenzahl + (int)preis; } // Standardkonstruktor Buch::Buch() { // Konstruktor ruft die Methode init() auf, welche das Objekt mit Standardwerten füllt. init(); } // 2. Konstruktor Buch::Buch( string Titel ) { init(); titel = Titel; // kein Konflikt, da case-sensitiv! // Auch möglich wäre dies: // this->titel = Titel; } // 3. Konstruktor Buch::Buch( int seitenzahl ) { init(); this->seitenzahl = seitenzahl; // "this->" hier zwingend erforderlich, da Namenskonflikt! } /** * Die anderen Konstruktoren folgen dem Schema. * Man stelle es sich vor... */ AufrufC++ void main() { // Standardkonstruktor Buch _0815; // mit Unterstrich, da Variablen nicht mit Zahlen beginnen können! // 2. Konstruktor Buch grusel("FH by night"); // 3. Konstruktor Buch kiddy(42); // 4. Konstruktor Buch dicky(29.95f, 888); // 5. Konstruktor Buch XXL1("Obelix", 4.98f, "Hinkelstein", 45); Buch XXL2("Obelix", 4.98f, "Hinkelstein"); // Standard-Konstruktor Buch bibliothek[1000]; }
Kategorie: Programmieren2 | 2. Semester |
Zahlen & Daten
Publish |