Teil VIII Programmierung mit C++ (4) Objektorientierung Überblick 1 Einführung Objektorientierung 2 Objekte und Klassen in C++ 3 Vererbung in C++ 4 Strukturen in C und C++ Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 381/715 Einführung Objektorientierung Definition (Objektorientierung) Objektorientierung ist ein Ansatz aus der Softwareentwicklung, der die Zusammenfassung von Daten und den dazugehörigen Funktionen in Klassen von Realweltobjekten unterstützt. Grundlegender Gedanke: weiteres Mittel zu Strukturierung des Programmtextes für komplexe Anwendungen Bisher: Funktionen fassen zusammenhängende Befehlsfolgen für Lösung eines Teilproblems zusammen Jetzt: Strukturierung der Daten (Variablen etc.) und der dazugehörigen Funktionen Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 382/715 Ziele der Objektorientierung Wiederverwendbarkeit → verminderter Programmieraufwand Nutzung vordefinierter Klassen aus Bibliotheken Definition eigener Klassen zur Verwendung in vielen Programmteilen Spezialisierung von Klassen: Erweiterung vordefinierter Klassen um neue Attribute und Funktionen Bessere Verständlichkeit und Wartbarkeit des Codes Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 383/715 OO Grundkonzepte: Klassen und Instanzen Klassen fassen Objekte mit gleichen Eigenschaften (Attributen) und gleichen auf sie anwendbaren Funktionen (Methoden) zusammen Gesamtheit von Attributen und Methoden entspricht dem Typ → Klassen beinhalten somit eine anwendungsspezifische und vom Programmierer entwickelte Typdefinition Objekte werden auch als Instanzen (Ausprägung, Einheit) der Klasse gespeichert Entstehen durch Erzeugung von Objekten des Klassentyps → Instantiierung Tragen die Werte für die in der Klasse definierten Attribute Grundlage für Aufruf der in der Klasse definierten Methoden Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 384/715 OO Grundkonzepte: Instanzen und Klassen Instanzen der Klasse Mitarbeiter Schmidt Claudia 70000 Finanzen Klasse Mitarbeiter Eigenschaften Name Vorname Gehalt Abteilung Schulz Peter 50000 Entwicklung Funktionen Einstellen Gehalt Erhöhen Abteilung Wechseln Entlassen Eike Schallehn, FIN/ITI Meier Gustav 80000 Marketing Grundlagen der Informatik für Ingenieure 385/715 OO Grundkonzepte: Kapselung Kapselung als Programmierkonzept unterscheidet die nach außen sichtbaren Attribute und Methoden (Schnittstelle der Klasse) von internen Eigenschaften und Methoden, die vor dem Nutzer der Klasse verborgen bleiben sollen (Implementierung der Klasse) Beispiel: Dateizugriff über fstream-Klassen Öffentlich zugänglich: Dateiname, Zugriffsmodus sowie Methoden zum Öffnen, Schließen, Lesen, Schreiben etc. Gekapselt: Methoden und Daten zum Zugriff auf Dateipuffer etc. Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 386/715 OO Grundkonzepte: Vererbung Vererbung oder auch (allgemeiner) Spezialisierung ist eine Beziehung zwischen Klassen und Typen, welche dadurch in einer Vererbungshierarchie stehen Ist eine Klasse eine Unterklasse einer Oberklasse, dann „Erbt“ sie die Attribute und Methoden der Oberklasse, d.h. diese sind ohne weiteren Programmieraufwand auch hier definiert Kann jedes Objekt der Unterklasse auch als Objekt der Oberklasse behandelt werden (→ Polymorphie) Beispiel: Objekte der Unterklasse Studenten und der Oberklasse Personen Jeder Student ist eine Person Jeder Student hat auch die Eigenschaften und Methoden einer Person im Allgemeinen Alles, was eine Person machen kann, kann auch ein Student machen Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 387/715 OO Grundkonzepte: Wiederverwendbarkeit Objektorientierung verringert bei geeignetem Einsatz den Entwicklungsaufwand durch Wiederverwendung Wiederverwendbarkeit durch Verwendung von Klassen als nutzerdefinierte Datentypen, die überall im Programm durch die Instantiierung von Objektvariablen verwendet werden können Ableitung eigener Klassen durch Spezialisierung von vorher implementierten Klassen oder Klassen einer vordefinierten Klassenbibliothek → Erweiterung um im neuen Anwendungskontext notwendige zusätliche Attribute oder Methoden Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 388/715 Anwendung der Objektorientierung Anwendung in vielen Bereichen der Informatik Objektorientierter Entwurf von Software mit Hilfe formaler Modelle oder grafischer Notationen (zum Beispiel UML) Zahlreiche objektorientierte Programmiersprachen Objektorientierte Datenbanken Objektorientierte Nutzerschnittstellen ... Im Folgenden: Objektorientierung in der Programmiersprache C++ Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 389/715 Objekte und Klassen in C++ Arbeiten mit Objektorientierung in C++ erfordert Definition von Klassen Implementierung von Konstruktoren zum Erzeugen von Objekten der Klasse Ggf. Implementierung von Destruktoren zum „Bereinigen“ der Daten von Objekten, die beim expliziten oder impliziten Löschen der Objekte aufgerufen werden Implementierung der Klassenmethoden Ggf. Implementierung von klassenspezifischen Operatoren Instantiierung der Klassen, d.h. Erzeugung von Objekten, durch Aufruf von Konstruktoren Als lokale Objektvariablen, z.B. auf dem Programm-Stack Als Objektvariablen auf dem Heap über new Arbeit mit Objekten durch Zugriff auf deren Attribute und Methoden Umsetzung der Vererbung zwischen Klassen Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 390/715 Objekte und Klassen in C++ Definition von Klassen durch Schlüsselwort class - im einfachsten Fall: class Klassenname { ... }; Bestandteil der Klasse können sein: Attributdeklarationen: Klassenvariablen vergleichbar Komponentenvariablen bei Strukturen Konstruktoren und Destruktoren Methodendeklarationen/-definitionen (Klassenfunktionen) Operatordeklarationen/-definition Zusätzlich: Kapselung durch Angabe ob Bestandteile public: überall, private: (Default, bei fehlender Angabe) nur in dieser Klasse oder protected: auch in abgeleiteten Klassen sichtbar sind, d.h. im Code darauf zugegriffen werden kann Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 391/715 Kapselung in C++ class Klassenname { private: // Alle nur in dieser Klasse sichtbaren Attribute, // Konstruktoren, Methoden, Operatoren kommen // hier hin. public: // Alle überall sichtbaren Attribute, // Konstruktoren, Methoden, Operatoren. // Destruktoren müssen hier stehen. protected: // Alle in dieser und abgeleiteten Klassen sichtbaren // Attribute, Konstruktoren, Methoden, Operatoren. }; Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 392/715 Beispiel: Vektor-Klasse Im Folgenden durchgehend verwendetes Beispiel: Klasse zur Arbeit mit mathematischen Vektoren beliebiger Dimensionalität Attribute: Dimensionalität des Vektor Array zur Speicherung der Komponenten Methoden: Norm (Betrag, Länge) des Vektors Ausgabe des Vektors als virtuelle Funktion (kann in abgeleiteten Klassen überschrieben werden → Vererbung) Operatoren: Addition zweier Vektoren mit + Multiplikation mit einem skalaren Wert mit * Außerdem zwei Konstruktoren und ein Destruktor Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 393/715 Beispiel: Klassendeklaration class Vektor { protected: int dimensionen; float* komponenten; public : Vektor(const Vektor& v); Vektor(int d, float k[]); ∼Vektor(); virtual void ausgabe(); float norm(); Vektor operator +(Vektor v); Vektor operator *(float skalar); }; Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 394/715 Anmerkung: Virtuelle Funktionen Virtuelle Funktionen (korrekter eigentlich: Virtuelle Methoden) erlauben ein späteres Überschreiben der Implementierung in abgeleiteten Klassen (→ Vererbung) Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 395/715 Implementierung von Methoden in C++ Zwei Alternativen für Implementierung von Methoden, Operatoren, Konstruktoren und Destruktoren Direkt innerhalb der Klassendefinition float norm() { float sum=0; for (int i=0; i<dimensionen; i++) sum+=komponenten[i] * komponenten[i]; return sqrt(sum); }; Außerhalb der Klassendefinition (empfohlen wegen Übersichtlichkeit) durch Angabe des Klassennamens als Scope float Vektor::norm() { float sum=0; for (int i=0; i<dimensionen; i++) sum+=komponenten[i] * komponenten[i]; return sqrt(sum); } Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 396/715 Konstruktoren in C++ Konstruktoren sind spezielle Methoden, die beim Erzeugen von Objekten aufgerufen werden Name der Methode entspricht Name der Klasse Haben in der Signatur keinen Rückgabewert Parameter können zur Initialisierung der Attribute verwendet werden Verschiedene Konstruktoren mit unterschiedlichen Parametern möglich Zwei spezielle Arten von Konstruktoren werden automatisch generiert, können aber vom Entwickler überschrieben werden Default-Konstruktor ohne Parameter, wenn nicht überschrieben zufällige Werte bzw. Aufruf Default-Konstruktoren der eingebetteten Objekte Copy-Konstruktor erzeugt eine Kopie eines existierenden Objektes diesen Typs Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 397/715 Beispiel: Konstruktoren Vektor::Vektor(int d, float k[]) { dimensionen = d; komponenten = new float[d](); for (int i=0; i<d; i++) komponenten[i] = k[i]; } Vektor::Vektor(const Vektor& v) { dimensionen = v.dimensionen; komponenten = new float[dimensionen](); for (int i=0; i<dimensionen; i++) komponenten[i] = v.komponenten[i]; } Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 398/715 Copy-Konstruktoren in C++ Falls nicht angegeben, existiert immer vordefinierter Copy-Konstruktor, der einfach alle Daten (inklusive Zeiger) eines Objektes direkt übernimmt Copy-Konstruktor wird an zahlreichen Stellen automatisch und für den Nutzer nicht sichtbar aufgerufen Beim Aufruf von Funktionen mit Objekt als Pass By Value Bei der Rückgabe eines Objektes als Ergebnis einer Funktion Bei der direkten Zuweisung einer Objektvariablen mit = Überschreiben des Copy-Konstruktors oft sinnvoll Wenn im Objekt Zeiger auf weitere Daten existieren, damit diese Daten, und nicht nur der Zeiger kopiert werden Signatur ist festgelegt Klassenname(const Klassenname& o) { ... }; Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 399/715 Instantiierung von Objekten Erzeugung von Objekten auf dem Stack Vektor v1(3,daten); Vektor v2; // Aufruf des Default-Konstruktors Vektor v3 = v1; // Aufruf des Copy-Konstruktors → werden beim Verlassen des aktuellen Scopes automatisch gelöscht (inklusive Aufruf des Destruktors) Erzeugung von Objekten auf dem Heap Vektor* v4 = new Vektor(3,daten); Vektor* v5 = new Vektor(); // Default-Konstruktor Vektor* v6 = new Vektor(*v4); // Copy-Konstruktor → müssen, wenn nicht mehr benötigt, explizit durch delete gelöscht werden, z.B. delete v4; (ruft ebenfalls automatisch Destruktor auf) Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 400/715 Destruktoren in C++ Spezielle Methode, die automatisch beim Löschen des Objektes aufgerufen wird Beim expliziten Löschen von Objekten auf dem Heap durch delete Für Objekte auf dem Stack veim Verlassen der aktuellen Funktion Deklaration immer als Methode der Form ∼Klassenname(); ohne Parameter Automatisch generierter Default-Konstruktor löscht nur Speicher des Objektes selber Überschreiben sinnvoll, um weiteren, indirekt vom Objekt genutzten und durch Zeiger referenzierten Speicher freizugeben, bzw. um sonstige „Aufräumarbeiten zur erledigen (z.B. Schließen oder Löschen von Dateien, Schließen von Fenstern, etc.) Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 401/715 Beispiel: Destruktoren Vektor::∼Vektor() { delete[] komponenten; } Löscht mit Vektor assoziiertes Array auf dem Heap → bliebe sonst als nicht mehr nutzbarer Speicherbereich (Memory Leak) belegt Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 402/715 Überladen von Operatoren in C++ C++ erlaubt für Klassen die Definition neuer Operatoren sowie das Überschreiben zahlreicher existierender Operatoren, d.h. die Zuweisung einer neuen Bedeutung dieser Operatoren durch eine anzugebende Implementierung Überschreiben zum Beispiel für arithmetische Operatoren (+, -, *, /, ++, etc.), Zuweisungsoperatoren (=, += etc.), Vergleichsoperatoren (==, >, <, etc.) und andere Deklaration in der Klasse mit operator und entsprechende Implementierung Im Beispiel der Klasse Vektor Vektoraddition + durch komponentenweise Addition Skalarmultiplikation * mit einem float-Wert Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 403/715 Beispiel: Überladen von Operatoren In der Klassendeklaration: Vektor operator +(Vektor v); Implementierung Vektor Vektor::operator+ (Vektor v) { Vektor result(this->dimensionen, this->komponenten); for (int i=0; i<dimensionen; i++) result.komponenten[i] += v.komponenten[i]; return result; } Anwendung, z.B. Vektor v2 = v1 + v1; Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 404/715 Der Zeiger this Vordefinierte Konstante in jeder C++-Klasse Der this-Zeiger verweist für jede aufgerufene Methode auf das Objekt (Adresse des Objektes), für das die Methode aufgerufen wurde Zum Beispiel notwendig ... zur Vermeidung von Namenskonflikten, wenn Parameter dieselben Namen wie Attribute der Klasse haben oder das Objekt selber als Rückgabewert der Methode zurückgeliefert werden soll Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 405/715 Beispiel: main-Funktion ... int main() { float daten[]={1,2,3}; Vektor v1(3,daten); cout << ”Die Laenge des Vektors v1 ”; v1.ausgabe(); cout << ” ist ” << v1.norm() << ” und v1 + v1 ist ” ; Vektor v2 = v1 + v1; v2.ausgabe(); cout << endl; return 0; } Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 406/715 Zerlegung des Quelltextes in C++ Konvention für komplexere Programme mit vielen Klassen: Jede Klassendeklaration in eine eigene Header-Datei (klassenname.h) Implementierung von Methoden, Konstruktore etc. dieser Klasse ebenfalls in eine eigene Quelldatei (klassenname.cpp) Hauptprogramm ebenfalls in separate Quelldatei (.cpp) Vorteile: Können vom Compiler separat und auch nur wenn notwendig, d.h. wenn genau diese Klasse verändert wurde, übersetzt werden Linker verbindet am Ende einzelne Module mit Hauptprogramm Überall wo eine Klasse genutzt wird, muss nur deren Header-Datei inkludiert werden Kürzere und übersichtlichere Dateien Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 407/715 Beispiel: Zerlegung des Quelltextes in C++ // File vektor.h #ifndef VEKTOR_H #define VEKTOR_H 1 class Vektor { ... }; #endif Verwendung der Präprozessoranweisungen verhindert mehrfaches indirektes Einbetten derselben Deklaration durch den Präprozessor Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 408/715 Vererbung in C++ C++ erlaubt Klassenhierarchien durch Spezialisierung Wichtigste Effekte: Vererbung (Inheritance): alle Attribute und Methoden der Oberklasse werden übernommen Spezialisierung: in der Unterklasse müssen nur zusätzliche, „speziellere“ Attribute und Methoden neu definiert werden Polymorphie: überall, wo ein Objekt der Oberklasse verwendet werden kann, kann auch ein Objekt der Unterklasse verwendet werden - uneingeschränkt nur bei Public Inheritance (s.u.) Überschreiben von Methoden (Overriding): in der Unterklasse kann eine speziellere Implementierung für eine Bereits in der Oberklasse implementierte Methode angegeben werden Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 409/715 Vererbung in C++ /2 class Unterklasse : [public|private|proted] Oberklasse {...}; Typ der Vererbung (public,private,proted) bestimmt, mit welcher Kapselung die public- und protected-Attribute und -Methoden der Oberklasse übernommen werden → meistens Public Inheritance sinnvoll → Default-Verhalten, d.h. wenn nicht angegeben, ist aber private! Auch Mehrfachvererbung durch kommaseparierte Liste von Oberklassen mit separatem Vererbungstyp möglich Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 410/715 Vererbung am Beispiel Einfaches Anwendungsszenario: für eine Firma sollen in einer Anwendung verschiedene Bauteile verwendet werden BauTeil: ist eine allgemeine Klasse von zu verwendenden Teilen, wobei jedes Bauteil eine Bezeichnung und eine Masse als Attribute hat. Neben einem Konstruktor zur Erzeugung von Bauteil-Objekten wird eine toString()-Methode für die Ausgabe benötigt. KaufTeil: ist eine spezielle Unterklasse Von Bauteilen, die von Zulieferern zu einem bestimmten Preis eingekauft werden. FertigungsTeil: ist eine spezielle Unterklasse Von Bauteilen, die innerhalb der Firma gefertigt werden und für die die Durchlaufzeit von Interesse ist. Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 411/715 Klassendefinition: Basisklasse Bauteil class BauTeil { private : string bezeichnung; float masse; public : BauTeil(string b, float m); virtual string toString(); }; Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 412/715 Klassendefinition: Unterklasse Kaufteil class KaufTeil : public BauTeil { private : string zulieferer; float preis; public : KaufTeil(string b, float m, string z, float p); virtual string toString(); }; Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 413/715 Klassendefinition: Unterklasse Fertigungsteil class FertigungsTeil : public BauTeil { private : int durchlaufzeit; public : FertigungsTeil(string b, float m, int d); virtual string toString(); }; Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 414/715 Konstruktor der Oberklasse Bauteil BauTeil::BauTeil(string b, float m) { bezeichnung = b; masse = m; } Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 415/715 Konstruktor der Unterklasse Kaufteil KaufTeil::KaufTeil(string b, float m, string z, float p) : BauTeil(b,m) { zulieferer = z; preis = p; } Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 416/715 Überschreiben der Methode toString() Die Methodendefinition string BauTeil::toString() { stringstream stst; stst << ”Teil : ” << bezeichnung << ”, ” << masse; return stst.str(); } aus der Oberklasse wird überschrieben durch string FertigungsTeil::toString() { stringstream stst; stst << ”Fertigungs” << BauTeil::toString() << ”, ” << durchlaufzeit; return stst.str(); } Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 417/715 Erklärungen zum Beispiel Bei Konstruktoren können durch den Syntax Klassenname::Klassenname(...) : Konstruktor(...) { ... } explizit Konstruktoren der Oberklasse(n) oder anderer eingebetteter Komponenten aufgerufen werden (bei mehreren kommasepariert) Entsprechend erzeugt der Konstruktor durch KaufTeil::KaufTeil(string b, float m, string z, float p) : BauTeil(b,m) das Kaufteil erst als „normales“ Bauteil und setzt dann die Werte beiden Kaufteil-Attribute Die Methode toString() überschreibt die Methode aus der Oberklasse BauTeil welche dort als virtual definiert wurde, um die zusätzlichen eigenschaften auszugeben, verwendet aber auch Implementierung aus der Oberklasse explizit durch die Angabe der Herkunft der Methode bei dem Aufruf Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 418/715 Virtuelle Funktionen in C++ Definition einer Funktion als virtual erlaubt Angabe einer anderen Implementierung in einer abgeleiteten Klasse Wird auch als Overriding (Überschreiben) bezeichnet Durch Late Binding (spätes bzw. dynamisches Binden, wird die „passende“ Implementierung zur Laufzeit gewählt Statisches Binden: korrekte Implementierung einer (nicht-virtuellen) Funktion wird vom Compiler in Abhängigkeit vom Typ der Objekt- oder Zeigervariable ausgewählt Dynamisches Binden: korrekte Implementierung einer virtuellen Funktion wird zur Laufzeit ausgewählt, d.h. es wird getestet ob das Objekt unabhängig vom Variablentyp selber von einem noch spezielleren Typ ist (möglich wegen Polymorphie) Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 419/715 Beispiel: Hauptprogramm Drei mal Aufruf der Methode toString() für Objekte verschiedenen Typs: int main() { BauTeil* b[3]; b[0] = new KaufTeil(”Getriebe”,122.5, ”Laios und Sohn”,99.99); b[1] = new FertigungsTeil(”Motor”,407.00,4); b[2] = new KaufTeil(”Vergaser”,72.00, ”Daidalos und Sohn”,49.99); for (int i=0 ; i < 3 ; i++) cout << b[i]->toString() << endl; return 0; } KaufTeil : Getriebe, 122.5, Laios und Sohn, 99.99 FertigungsTeil : Motor, 407, 4 KaufTeil : Vergaser, 72, Daidalos und Sohn, 49.99 Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 420/715 Strukturen in C und C++ Strukturen in C Vorstufe der Objektorientierung: fassen vergleichbar mit Klassen von Objekten Daten zusammen Strukturen dienen in C lediglich der Zusammenfassung inhaltlich zusammengehöriger Variablen (keine Vererbung, Kapselung, Methoden, etc.) Erweiterung in C++: können dort ähnlich wie Klassen verwendet werden und bieten zusätzliche Funktionalität Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 421/715 Strukturen in C: Deklaration und Initialisierung Einfachste Form der Deklaration inklusive einer Benennung des Strukturtyps (für spätere Wiederverwendung) und der sofortigen Deklaration von Variablen dieses Typs struct typ_name { datentyp variable1; datentyp variable2; ... } struct_variable1, ... ; Initialisierung ähnlich Arrays über Werteliste (verschiedenen Typs) möglich struct typ_name struct_variable = {...}; zum Beispiel struct studenten_typ s = {”Meier”,”Karl”,”123456”,25}; Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 422/715 Strukturen und C++ Strukturen wie oben dargestellt auch in C++ verwendbar Implizieren immer Typdefinition Verwendbarkeit in C++ erweitert: haben vergleichbare Möglichkeiten wie Klassen, d.h. Vererbung (→) Kapselung (→) Methoden (→) Unterschied zu Klassen: Default-Zugriff für Attribute und Methoden sowie Vererbung ist public Häufig jedoch „elegantere“ Lösung durch Verwendung objektorientierter Konzepte wie Klassen möglich Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 423/715 Zusammenfassung: Objektorientierung in C++ Grundkonzepte der Objektorientierung Klassen von Objekten mit gleichen Eigenschaften Methoden als Beschreibung der Funktionalität, welche zu diesen Objekten gehört Vererbung als Mittel zur Wiederverwendung von Code Erlaubt Entwicklung sehr gut strukturierter und damit leicht zu entwickelnder und zu pflegender Programme Konzepte sind in der Anwendung aber recht komplex → erfordert „objektorientierte Denkweise“ Objektorientierung erfolgreiches Konzept, das sich in vielen Programmiersprachen aber auch in anderen Gebieten durchsetzt Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 424/715 Zusammenfassung C und C++ C und C++ ... sind weit verbreitet eingesetzte Programmiersprachen in allen denkbaren Anwendungsbereichen stellen eine Hauptlinie bei der Entwicklung von Programmiersprachen dar, d.h. viele andere Programmiersprachen sind davon abgeleitet sind sehr umfangreiche Programmiersprachen mit zahlreichen umgesetzten, anspruchsvollen Konzepten C und C++ sind keine „einfachen“ Programmiersprachen ABER: „wer C++ programmieren kann, kann auch (fast) alles andere programmieren“ Eike Schallehn, FIN/ITI Grundlagen der Informatik für Ingenieure 425/715 Zusammenfassung C und C++ /2 In der Vorlesung: wichtigste Kernkonzepte vorgestellt C und C++ umfassen noch wesentlich mehr Konzepte: Bitmanipulaionsoperatoren - Union-Typkonstruktor - Typqualifikatoren: const und volatile - Zeiger auf Funktionen - Präprozessor pragmas bedingte Kompilierung - Unicode in C/C++ - virtuelle Vererbung zahlreiche Standardbibliotheken - Typumwandlung durch Casting Reflexion und Laufzeittypinformationen - Entwicklungsumgebungen Debugging - Entwicklungstools - Programmstacks - Templates für Klassen und Funktionen - Statische Methoden - virtuelle Destruktoren Namensräume - friend-Klassen - Entwicklung von Nutzerschnittstellen (GUIs) - Arbeit mit Hardwareschnittstellen - Arbeit mit Netzwerken Multithreadding - Coding Conventions - Eike Schallehn, FIN/ITI ... Grundlagen der Informatik für Ingenieure 426/715