Objektorientierte Programmierung mit C++
Diese Vorlesung führt in die objekt-orientierte Programmierung mit C++17 ein. Hierbei stehen nach einer Einführung die Techniken im Vordergrund, die von anderen objekt-orientierten Programmiersprachen wie insbesondere Java nicht unterstützt werden. Dazu gehören insbesondere der statische Polymorphismus und die Meta-Programmierung, die viele Entscheidungen und Anpassungen in die Übersetzzeit verlagern. Zielsetzung ist die Erlernung objekt-orientierter Modellierungstechniken, die ein hohes Maß an Abstraktion, Flexibilität und Wiederanwendbarkeit ermöglichen, ohne dabei Kompromisse zu Lasten der Performance eingehen zu müssen. Die Vorlesung bietet daher eine Grundlage für die Anwendung von C++ im Bereich des High Performance Computing. Im SS 2019 gibt es im Anschluss die Vorlesung Parallele Programmierung mit C++.
Inhalt
- Einführung in OO-Design, UML und Design by Contract
- Einführung in C++
- Dynamischer Polymorphismus in C++
- Generische Module auf Basis von Templates
- Statischer Polymorphismus auf Basis von Templates
- Metaprogrammierung, Funktionsobjekte und λ-Ausdrücke
- STL-Bibliothek, iostreams-Bibliothek
- Potentiale und Auswirkungen optimierende Übersetzer bei C++
Termine
- Vorlesung: Dienstag, 14–16 Uhr, Helmholtzstraße 22, Raum E.03
- Übungen: Donnerstag, 16–18 Uhr, Helmholtzstraße 18, Poolraum E.44
- Die erste Vorlesung findet am Dienstag, den 17. April 2018, statt.
Die Übungen am 19. Juli finden in der Helmholtzstraße 22, Raum E.03, statt.
Voraussetzungen
Vorausgesetzt werden die Kenntnisse aus einer Grundvorlesung für Informatik. Insbesondere sollten elementare Algorithmen und Datenstrukturen bekannt sein und praktische Erfahrungen mit einer Programmiersprache bestehen (z.B. Java). In den Übungen wird auf der Kommandozeile unter UNIX bzw. Linux gearbeitet. Entsprechende Kenntnisse wären vorteilhaft.
Prüfungen
Die Vorlesung ist ein Wahlpflichtmodul im Modulhandbuch der Master-Studiengänge Informatik, Mathematik, Wirtschaftsmathematik und Computational Science and Engineering. Teilweise ist die Vorlesung in den Modulhandbüchern der entsprechenden Bachelor-Studiengänge. Vorleistungen gibt es keine. Zu den folgenden Terminen werden schriftliche Prüfungen angeboten:
- Freitag, den 3. August 2018, 10:00 bis 12:00 Uhr, N24, Hörsaal H12
- Montag, den 1. Oktober 2018, 08:00 bis 10:00 Uhr, Helmholtzstraße 18, Raum 1.20
Es steht eine Probeklausur zur Verfügung, die ich aber in der letzten Vorlesungswoche noch etwas an die aktuelle Vorlesung anpassen werde.
Vorlesungen
Folien aus der Vorlesung:
- 17. April 2018: Syllabus, Einführung
- 19. April 2018: Einführung in C++
- 24. April 2018: Einführung zu den Klassen in C++
- 8. Mai 2018: Einführung in UML, design by contract
- 15. Mai 2018: Dynamische Datenstrukturen in C++
- 22. Mai 2018: Dynamischer Polymorphismus
- 29. Mai 2018: Einführung zu generischen Klassen
- 5. Juni 2018: Statischer Polymorphismus (1. Teil)
- 12. Juni 2018: Statischer Polymorphismus (2. Teil)
- 19. Juni 2018: Funktionsobjekte und Lambda-Ausdrücke
- 26. Juni 2018: Ausnahmenbehandlungen
- 3. Juli 2018: Intelligente Zeiger und Einführung in die STL Beispiele: lambda.tar.gz (kleine Sprache mit Value als varianter Datenstruktur), lambda-hier.tar.gz (kleine Sprache mit einer Typhierarchie zu Value), weak-pointers.tar.gz (doppelt verkettete Liste mit intelligenten Zeigern)
- 10. Juli 2018: Metaprogrammierung Beispiel: primes.hpp, testprimes.cpp
- 17. Juli 2018: Optimierungen bei C und C++
- Alle Folien in einem PDF-Dokument (Stand: 17. Juli 2018)
Übungen
- Melden Sie sich bitte für die Teilnahme in den Übungen bei SLC an.
- Die Übungen sind zeitintensiv und integraler Teil einer praxisorientierten Vorlesung.
Übungsaufgaben und -sitzungen:
- 19. April 2018: Erste einführende Übungssitzung
- 26. April 2018: Blatt 1 (Erste Erfahrungen mit Klassen in C++), Beispiellösungen: Nim1.tar.gz und Nim2.tar.gz
- 3. Mai 2018: Übungssitzung zu den speziellen Methoden einer Klasse
- 17. Mai 2018: Blatt 2 (Erstellung eines UML-Klassendiagramms) und Übungssitzung zu Objekten, die Ressourcen verwalten, Beispiellösung: classdiag.mp und classdiag.pdf
- 24. Mai 2018: Blatt 3 (Entwicklung einer abstrakten Klasse und zugehöriger polymorpher Implementierung mit dynamischen Nachladen), Beispiellösung: Nim.tar.gz (aktualisiert am 4. Juli: Makefile unterstützt jetzt auch Linux und macOS)
- 7. Juni 2018: Blatt 4 und Blatt 5 (Entwicklung einer Template-basierten Container-Klasse) und Übungssitzung zu generischen Container-Klassen, Beispiellösungen: Blatt 4: Trie1.tar.gz, Blatt 5: Trie2.tar.gz
- 14. Juni 2018: Blatt 6 (Virtuelle Container) und Übungssitzung zu Überladungen und SFINAE Beispiellösungen: concatenate.hpp, testit.cpp
- 21. Juni 2018: Blatt 7 (Lambda-Ausdrücke, Vorlage: lambda-vorlage.tar.gz) und Übungssitzung zu Funktionsobjekten, Beispiellösung: lambda.tar.gz
- 28. Juni 2018: Übungssitzung zu Ausnahmenbehandlungen
- 5. Juli 2018: Übungssitzung zu dynamischen Datenstrukturen mit RAII-Zeigertypen
- 12. Juli 2018: Blatt 8 (Metaprogrammierung, Vorlage: nim.tar.gz) und Übungssitzung zu Templates mit einer variablen Zahl von Parametern, Beispiellösung: nim-loesung.tar.gz
Kontakt
Dr. Andreas F. Borchert
Helmholtzstr. 20
Raum 1.23