C++ Grundkurs

Benutzerdefinierte Literale

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die aktuellen Versionen von C++ ermöglichen es, Strings oder Zahlen mit einer Einheit zu verknüpfen. Dabei sorgt der Programmierer für die Implementierung, der Compiler fügt die Komponenten zusammen.
06:47

Transkript

In dieser Lektion will ich Ihnen benutzerdefinierte Literale in C++ vorstellen. Benutzerdefinierte Literale lösen ein langes Problem in der Mathematik. Was sind eineinhalb Äpfel plus eine Birne? 2.5. Das geht natürlich nicht. Benutzerdefinierte Literale erlauben Ihnen solche Ausdrücke dem Compiler zu verbieten. Soweit ich weiß, ist das ein einmaliges Konzept in der Programmiersprache. Das heißt, C++ ist die einzige Programmiersprache, die so was anbietet. Es ist aber ein relativ anspruchsvolles Konzept. Ich zeige es ihnen zuerst in der Theorie und dann in der Praxis. Was ist ein benutzerdefiniertes Literal? Es besteht aus drei Teilen. Aus einem built_in-Literal wie Sie sie kennen, wie z.B. hier unter der binäre Ausdruck 10101010 dem Unterstrich und einem Suffix. Den Suffix können Sie vorgeben. In diesem Fall bedeutet es, dass soll eine Binärzahl sein. Das bedeutet, es soll eine Kilometerangabe sein. Das ist hier ist ein Internationaliszierungsstring und das hier drückt aus, dieser Buchstabe hier ist ein Character, also ein Zeichen. Built_in-Literale gibt es in 4 verschiedenen Geschmacksrichtungen in C++. Als natürliche Zahlen, als Fließkommazahlen, als C-String-Literale oder als Zeichen-Literale. Wie funktioniert das Ganze? Noch ein bisschen Theorie. Benutzerdefinierte Literale werden auf den sogenannten Literal-Operator abgebildet. Das machen nicht Sie, das macht der Compiler. D.h., wenn Sie so was verwenden wie das benutzerdefinierte Literal 1.45, sucht der Compiler nach dem Operator, der so ausschaut wie dieser hier. operator ““_km. Wenn er das findet, wendet er den an, wenn nicht gibt es einen Compilerfehler. Literal-Operatoren können in zwei verschiedenen Geschmacksrichtungen auftreten, in der sogenannte Cooked-Form und in der Raw-Form. Für Fließkommazahlen und natürlichen Zahlen gibt es eine Cooked und eine Raw-Form. Für C-Strings und Zeichen gibt es das nur in der Raw-Form. Was ist die Cooked-Form? Die Cooked-Form bedeutet, dass dieser Ausdruck hier als Zahl interpretiert wird und Ihnen steht er als Zahl zur Verfügung. Bei 1.45 steht er Ihnen als 1.45 zur Verfügung. In der Raw-Form steht Ihnen der Ausdruck als const char Pointer zur Verfügung inklusive der Länge. Wenn Sie diesen Ausdruck betrachten, sehen Sie, da steht die 4. Die 4 drückt genau aus, dass dieser String hier aus 4 Zeichen besteht. Das war die Raw-Form. Das war die Cooked-Form. Die Raw-Form gibt es für alle benutzerdefinierten Literale. Die Cooked-Form gibt es nur für long double und für long int, also für Fließkommazahlen und für natürliche Zahlen. Jetzt zeige ich Ihnen es in der Anwendung. Erst mal führe ich das Programm aus und Sie sehen, ich muss ein bisschen nach oben scrollen. Ich fange im Sourcecode an. Hier gebe ich die Zahl 1.0 km aus. Das soll also eine Kilometerangabe repräsentieren. Was passiert jetzt? Ich verwende den Ausdruck 1 km und er Compiler sucht jetzt nach dem sogenannten Literal-Operator. Wenn ich hier hochgehe, sehen Sie, hier habe ich einen definiert. Dieser Ausdruck wird vom Compiler auf diesen Literal-Operator abgebildet. Den Wert, in diesem Fall 1.0, geben wir hier den double Wert zur Verfügung. Wie geht es jetzt weiter? Ich instanziiere als Returnwert ein Distance Objekt MyDistance und da sage ich, nimm Datenschutz d hier und rechne es mal 100000. Wieso 100000? Weil ich einfach sage, meine Norm für eine Distance ist 1 cm und um 1 km in 1 cm umzurechnen muss ich ihn eben mal 100000 nehmen. Hier ist die MyDistance Klasse, die hat intern eine Variable cm, wo ich eben die Distance speichere. Ein Constructor, mit dem ich die Variable initialisiere. Den rufe ich durch diesen Aufruf hier auf. Was ich hier vor allem habe, ist ein überladener Ausgabeoperator. Sie sehen, dann gebe ich den Wert aus d mal 100000 gefolgt von einem Leerzeichen und cm. Das ist genau das, was Sie hier sehen in der Ausgabe. Das ganz Gleiche tue ich für den m, für den dm und für den cm. Natürlich rechne ich es jetzt anders um. Mal 100, mal 10 und gar nicht, weil ich in der richtigen Einheit bin. Das war die einfache Anwendung, indem ich den Literal-Operator angewendet habe, um eine Zahl in der richtigen Normierung auszugeben. Richtig spannend wird es hier unten. Ich gehe weiter in der Ausgabe, weil ich will von der Ausgabe her Ihnen alles erklären. Ich habe einen Ausdruck definiert, einen komplizierten. 1 km plus 2 die Möglichkeit plus 3 die Möglichkeit plus 4 cm ist gleich. Ich weiß es nicht. Was passiert jetzt? Der Compiler sieht diesen Ausdruck, wendet diesen Operator an, instanziiert MyDistance mit dem entsprechenden Wert. Das Gleiche macht er für dm und hier auch noch für cm. Jetzt habe ich noch den Plus-Operator überladen. Das heißt, er addiert auch noch den km zu dem dm, wohl gemerkt, nachdem diese beiden Werte in der richtigen Einheit sind, cm. Addiert, addiert, addiert. Als Ergebnis kommt raus 100054 cm. Ich kann natürlich auch abziehen mit Minus ganz einfach, weil ich hier oben auch den Minus-Operator überladen habe. Ich denke, das Beispiel muss ein bisschen auf Sie wirken. Ich werde es nochmal paraphrasieren. Von diesen Ausdruck ausgehend, wie geht es los? Der Compiler sieht, das ist ein benutzerdefiniertes Literal. Dann versucht er diesen Ausdruck aufzulösen, versucht was damit anzustellen. Was macht er? Er bildet es ab auf einen Literal-Operator. Der passt hier genau. _km entspricht diesem _km hier. Im nächsten Schritt instanziiere ich ein MyDistance Objekt, in dem ich die km auf cm normiere, also mal 100000 rechne. Dann habe ich im MyDistance Objekt, wo hier statt 1 eben 100000 drinnen steht. Das Gleiche macht er auch hier für die 2 dm, für die 3 dm und für cm. Im nächsten Schritt versucht er natürlich diese Plus-Operator darauf anzuwenden auf die MyDistance Objekte. Das kann er aus dem einfachen Grund, weil ich den Plus-Operator für Instanzen vom Typ MyDistance überladen habe. Wie tue ich das? Ganz einfach, indem ich die internen Werte, die cm einfach zusammenaddiere bzw. subtrahiere entsprechend davon, ob ich plus oder minus rechne. Was ich jetzt unterschlagen habe. Ich habe auch den Ausgabe-Operator überladen, sodass ich die Zahlen ausgeben kann. In dieser Lektion habe ich Ihnen benutzerdefinierte Literale vorgestellt. Eine sehr interessante und sehr mächtige Technik, die hilft Literale mit eigenen Einheiten zu versehen, sodass sie, wie in diesem Fall Arithmetik betreiben können und der Compiler passt genau auf, dass Sie nicht Äpfel mit Birnen addieren.

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!