Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++ Grundkurs

Programmierparadigmen

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Programmierparadigmen beschreiben die Art und Weise einer Problemlösung in einer Programmiersprache. In C++ stehen das objektorientierte, das generische sowie das funktionale Paradigma zur Auswahl.
10:22

Transkript

In dieser Lektion werde ich die Programmierparadigmen von C++ vorstellen. Zum einen, weil C++ mehrere Programmierparadigmen unterstützt, zum anderen, weil Sie an diesen Programmierparadigmen sehr gut die Evolution von C++ nachvollziehen können. Ich habe hier einen Pfeil dargestellt, der beginnt bei C, geht weiter zum klassischem C++ und endet bei modernem C++. Im Zuge dieses Fortschritts unterstützt C++ immer weitere Programmierparadigmen. Bevor ich darauf eingehe, noch ein Wort zu Programmierparadigmen. C++ nennt sich eine Multiparadigmen-Programmiersprache. Das bedeutet, die Sprache unterstützt mehrere Paradigmen. Ein Programmierparadigma stellt die Art und Weise dar, wie Sie ein Problem lösen. Jetzt fange ich bei dem Pfeil hier unten an. In C kennen Sie das prozedurale und strukturierte Programmierparadigma. Prozedural ist im Wesentlichen, dass sie so was wie Funktionen besitzen, wo Sie Abläufe definieren, und diese wiederholt aufrufen können. In strukturiert steckt bereits der Begriff der Struktur. Sie haben also so etwas wie Datenstrukturen. Das sind einfache Wrapper um verschiedene Datentypen. Mit C++ gibt es neue Programmierparadigmen. Die zwei wichtigsten sind das objektorientierte und das generische. Das objektorientierte ist das Programmierparadigma, das Sie kennen, mit Klassen und Instanzen. Das generische ist Ihnen vielleicht auch unter dem Namen Templates bekannt. Da geht es darum, dass Sie Funktionen und Klassen über Typen parametrisieren. Dann unterstützt C++ insbesondere das funktionale Programmierparadigma. Das heißt, Sie konnten auch bereits im klassischen C++ funktional programmieren. In C++11 geht es noch deutlich besser. Nun will ich Ihnen insbesondere die jüngsten drei Programmierparadigmen in der Anwendung zeigen. Zum ersten: Das objektorientierte Programmierparadigma. Hier habe ich eine Klasse HumanBeing, von der ich zwei Klassen abgeleitet habe, Man und Woman. Was zeichnet einen HumanBeing aus, einen Menschen? Er sollte so was wie einen Namen besitzen. Dafür verwende ich in einem Konstruktoraufruf die interne Variable name, hier zu sehen und als private Variable initialisiert. Dann will ich natürlich von meinen HumanBeings wissen, wie sie heißen. Also biete ich eine Funktion getName an, und dann sollen Instanzen der Klasse HumanBeing auch die Möglichkeit haben, ihren Namen zu ändern, und darum biete ich eine Funktion chanName an. Ich setze also einen neuen Namen ein. Das ist die Klasse HumanBeing. Wenn man es genau überlegt, macht HumanBeing eigentlich keinen Sinn. Es gibt ja nicht das generelle Wesen Mensch. Es gibt Männer und Frauen. Daher spezialisiere ich HumanBeing in zwei Arten. Ich leite öffentlich oder public von HumanBeing ab. Eine Klasse Man und eine Klasse Woman. Die erben alle Konstruktoren der Basisklasse. Das ist die using-Direktive hier. Mann und Frau besitzen jetzt eine weitere öffentliche Methode getSex, und was man mit dieser Methode machen kann, ist, einfach zu fragen: "Bist du männlich oder bist du weiblich?" Ein Mann wird auf getSex mit male, eine Frau wird mit female antworten. Das war das objektorientierte Programmierparadigma. Nun zum generischen, auch bekannt unter "Templates" in C++. Hier habe ich zwei Templates, ein Funktionstemplate und ein Klassentemplate. Zuerst zum Funktionstemplate. Wenn Sie das Funktionstemplate betrachten, ohne die erste Zeile template <typename T hier, dann sieht das eigentlich nicht besonders aus. Fast wie eine normale Funktion. Der einzige Unterschied ist, statt dass hier ein konkreter Typ wie int, double oder standard string steht, steht hier t. Das ist ein Typparameter. Diesen Typparameter definiere ich hier oben. Das ist eigentlich der einzige Unterschied zur normalen Funktion. Sie parametrisieren in diesem Fall eine Funktion über einen Typ. Das Praktische daran ist, dass diese Funktion oder dieses Funktionstemplate, um ganz exakt zu sein, für verschiedene Typen anwendbar ist. Hier z.B. für zwei ints und hier auch für den huber und den maier. Meine HumanBeings aus der objektorientierten Programmierung. Was kann ich machen? Ich kann i und j vertauschen. Ich kann aber huber und maier auch vertauschen. Genau das macht xchg. Was Sie in dem Beispiel auch schön sehen, ist, dass ich objektorientierte Programmierung, huber und maier sind sozusagen Produkte der objektorientierten Programmierung, in der generischen Programmierung verwenden kann. Das sind also durchaus Paradigmen, die zusammenpassen. Hier noch ein Klassen-Template. Das Klassen-Template ist ein ganz simples Array. Damit es eben auf diese Seite hier drauf passt. Was will ich beim Array variabel halten? Ich will zum einem eine Typvariable halten - typename T - und ich will zum anderen auch variabel halten, wie viele Elemente das Array beinhalten soll. Also gebe ich das nach außen. Dieses Array ist also über den Typ und über seine Anzahl an Elementen parametrisiert. Intern hat es das Datum elem. Das ist ein C-Array vom Typ T mit N Elementen. Das Einzige, was das Array mir anbietet, ist eine Funktion getSize. Da kann ich eben die Größe ermitteln, also wie viele Elemente das Array tatsächlich umfasst. Das gibt genau das N zurück, das ich hier in der Template-Spezifikation definiert habe. Hier unten sehen Sie, wie ich das Template verwenden kann. Als erstes instanziiere ich ein Template vom Typ double mit 10 Elementen und kann hier die Size abfragen. In diesem Fall bekomme ich natürlich 10 heraus. Als zweites instanziiere ich ein Template von Männern an der Anzahl 5. Da kann ich natürlich auch die Size abfragen. Nun komme ich noch zum funktionalen Programmierparadigma. Es ist ein bisschen viel Text, aber das gehe ich von Anfang bis Ende mit Ihnen durch. Hier der Standardvektor int, dort instanziiere ich einen Vektor auf eine sehr gemütliche Art und Weise. Das geht erst mit modernem C++, über sogenannte Initialisiererlisten. Ich initialisiere also einen Vektor von int mit den Werten 1, 2, 3, 4, 5, 6, 7, 8, 9. Dann mache ich noch einmal einen Vektor auf, diesmal über Strings, und die Strings sind: "Programming", "in", "a", "functional", "style." Was Sie hier wieder sehen, ich will hier das funktionale Programmierparadigma zeigen und verwende unter der Decke ein Template bzw. auch die generische Programmierung. Also die Programmierparadigmen passen zusammen. Jetzt wende ich den Algorithmus std::accumulate der Standard Library an. Was will ich machen? Ich will alle Zahlen meines Vektors von 1-9 miteinander multiplizieren. Da gehe ich von vec.begin bis vec.end und wende auf jedes Pärchen die Lambda-Funktion an, und das ist ein Konstrukt, das sehr wichtig in der funktionalen Programmierung ist. Ich wende die Lambda-Funktion an. Die schaue ich mir jetzt mit Ihnen genauer an. Hier wird die Lambda-Funktion eingeleitet. Das sind die zwei Argumente der Lambda-Funktion a und b und hier steht drin, was ich mit den beiden machen will. Ich multipliziere sie. Das gibt die Funktion dann zurück. Was hier tatsächlich passiert ist: Ich gehe von vec.begin bis vec.end und multipliziere alle Werte. Das passiert in der folgenden Art und Weise. Dass ich im ersten Schritt 1 x 2 berechne. Das Ergebnis ist natürlich 2. Im zweiten Schritt nehme ich das Ergebnis von zuvor, das ist die 2, und multipliziere sie mal 3. Im dritten Schritt nehme ich das Ergebnis von zuvor, das ist die 6, multipliziere sie mal 4, und so weiter, bis ich am Ende angelangt bin, und das Ergebnis ist 362880. Sie werden es wissen, das ist die 9!-Fakultät. Das gleiche kann ich natürlich auch mit Strings machen. Hier macht das Multiplizieren natürlich keinen Sinn. Ich verknüpfe in diesem Fall die Strings, oder Pärchen von Strings, durch einen Doppelpunkt. Ich hänge sie aneinander und setze dazwischen einen Doppelpunkt. Wenn ich das mache, bekomme ich sozusagen einen String, der die Strings von vorher durch einen Doppelpunkt separiert. Nun wende ich noch eine weitere Funktion der Standard Template Library an, std::transform modifiziert den Vektor in place und es ist die Frage, was er macht. Er geht jedes einzelne Element durch. Darum habe ich hier nur ein Argument int i. Das ist genau der Typ meines Vektors, und er bildet i auf i**2 ab. Das heißt, er multipliziert das Element mit sich selbst und das Ergebnis ist 1, 4, 9, 16. Das sind die Quadratzahlen. Noch einmal ein Beispiel für die funktionale Programmierung. Diesmal verwende ich den Algorithmus std::remove_if. Ich gehe wieder durch den Vektor, von vec.begin bis vec.end, und will alle Elemente entfernen, mit remove_if, die kleiner 3 und größer 8 sind, und was dabei übrig bleibt. sind 3, 4, 5, 6, 7, 8. Hier verwende ich noch das neue Schlüsselwort auto. Das hilft mir, eine Variable zu definieren, ohne dass ich deren konkreten Typ kennen muss. Das nennt sich im modernen C++ automatische Typableitung. Die gibt es als Funktionalität auch in der funktionalen Programmierung. Im letzten Beispiel wende ich nochmals remove_if an, aber diesmal auf meine Strings. Diesmal will ich alle Strings aus "Programming", "in", "a", "functional" "style." entfernen, die dem folgenden Kriterium nicht entsprechen. Das war jetzt kompliziert gesagt. Ich entferne alle Strings, deren erster Buchstabe kleingeschrieben ist. Mit s referenziere ich den String. "Programming", "in", "a", "functional", "style" besteht aus jeweils einzelnen Strings. Mit 0 greife ich auf dessen erstes Element zu. Damit finde ich alle, die klein geschrieben sind. Was übrig bleibt, ist das einzige Wort, das groß geschrieben ist, also "Programming". In dieser Lektion habe ich Ihnen die Programmierparadigmen in C++ vorgestellt. Insbesondere habe ich Ihnen die moderneren Programmierparadigmen und auch die mächtigeren Programmierparadigmen in C++ vorgestellt. Das ist die objektorientierte, das ist die generische, und das ist die funktionale Programmierung. Sie haben aber auch gesehen, dass sich die Paradigmen schön miteinander verheiraten lassen, sodass Sie durch die Kombination dieser Paradigmen noch mehr Funktionalität erhalten.

C++ Grundkurs

Steigen Sie in die mächtige Programmiersprache C++ ein und lernen Sie dabei alle wichtigen Funktionen mit Anwendungsbeispielen kennen.

8 Std. 14 min (147 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!