
Der Begriff „modernes C ++“ wird häufig als Synonym für den Ausdruck „Code unter Verwendung des neuen C ++ - Standards“ verwendet. Hier kann „neu“ alles von C ++ 11 bis C ++ 17 bedeuten oder sogar das, was bereits in C ++ 20 verfügbar ist. Ich denke, modernes C ++ ist etwas mehr, nicht nur das Hinzufügen des
Flags -std = c ++ 17 .
Was bedeutet modern?
Wenn wir im Internet nach der Bedeutung des Wortes „modern“ suchen, finden wir als eine der ersten eine Definition aus dem
Merriam-Webster-Wörterbuch . Hier sind zwei Teile, die sich auf C ++ beziehen:
[...]2: Einbeziehung neuer Techniken, Methoden oder Ideen: (aktuelle) moderne Kommunikationsmethoden3 groß geschrieben: von, in Bezug auf oder mit den Merkmalen der gegenwärtigen oder jüngsten Entwicklungsperiode einer Sprache - Modernes Englisch[...]Techniken, Methoden und Ideen beziehen sich nicht nur auf die neuen Funktionen der Sprache. Oft unterstützen oder beinhalten diese neuen Funktionen neue Techniken, aber viele davon gibt es schon seit geraumer Zeit. Die Merkmale der Sprachentwicklung basieren darauf, wie wir die Sprache verwenden. Dies bezieht sich darauf, wie wir alte und neue Funktionen kombinieren. Dies ist mehr als nur ein funktionierendes C ++ - Programm oder etwas, das in der Standardbibliothek enthalten ist.
Man könnte argumentieren, dass die seit C ++ 98 vorhandenen Funktionen nicht Teil des modernen C ++ sind, weil sie zu lange existieren. Es muss jedoch beachtet werden, dass die aktivsten Leute in der Community, die über „modernes C ++“ sprechen oder schreiben, am häufigsten Pioniere sind. Die meisten verwenden, studieren und unterrichten sogar das gute alte „C mit Klassen“ aus den 90er Jahren, was viele der Methoden, die dort nicht verwendet werden, zu einem Teil des modernen C ++ macht.
Über neue Funktionen hinaus
Welche der in C ++ 98 verfügbaren Optionen gehören meiner Meinung nach zur Kategorie „modernes C ++“? Hier ist eine unvollständige Liste einiger wichtiger Funktionen und Ideen:
RAII
RAII steht für "Eine Ressource zu bekommen ist Initialisierung" oder "Verantwortung zu bekommen ist Initialisierung". Obwohl sich der Name auf "Initialisierung" konzentriert, ist der Schlüsselteil hier tatsächlich der Destruktor. Die deterministische Freigabe von Ressourcen ist eines der Hauptmerkmale von C ++, das es von den meisten anderen Sprachen unterscheidet. Für viele ist dies das
wichtigste Merkmal.
RAII kann verwendet werden, um viele Dinge zuverlässig zu verwalten, wie z. B. Speicher (z. B.
std :: vector, std :: string ), Dateideskriptoren (
std :: fstream ), Netzwerkverbindungen, Mutexe, Datenbankverbindungen sowie Entitäten, die sind entfernt mit Ressourcen verbunden. Wenn Sie eine zuverlässige Methode benötigen, um eine Aktion auszuführen und diese dann abzubrechen, wenn Sie einen bestimmten Bereich verlassen oder ein Objekt zerstören, benötigen Sie RAII.
Ich habe viel Code gesehen, in dem die manuelle Reinigung am Ende der Funktionen zu einem Albtraum wurde. In Ausnahmefällen findet eine solche Reinigung nicht statt. In dieser Situation
benötigen Sie RAII . Selbst wenn Sie keine Ausnahmen verwenden, kann ein
vorzeitiges Beenden von Funktionen Ihren Code erheblich verbessern, jedoch nur, wenn Sie ihn nicht bereinigen müssen.
Die RAII-Technik ist definitiv Teil des modernen C ++, obwohl sie von Anfang an verfügbar war.
Starkes Tippen
Die Idee des
starken Tippens war in letzter
Zeit sehr beliebt. In der Vergangenheit wurden alle Bezeichner, Größen, Postleitzahlen, Preise usw. über int oder double oder einen anderen arithmetischen Typ dargestellt. Die Tatsache, dass sie kompatibel waren, völlig unabhängig voneinander, die rein zufällig vom gleichen Typ sind, war eine Quelle von Fehlern, aber was kann ich tun? Zumindest
konvertiert der Compiler
Zahlen und Arrays nicht stillschweigend
in Strings !
Tatsächlich stellt sich heraus, dass das System vom Typ C ++ und die vom Compiler bereitgestellten Zero-Cost * -Abstraktionen viel bewirken können. Erstellen Sie einfach verschiedene Typen für Kennungen, Postleitzahlen, Größen (nein, kein typedef, danke) und so weiter. Wenn Sie interessiert sind,
lesen Sie einen der Vorträge von
Björn Fahller ,
Jonathan Boccara oder
Jonathan Müller .
* (Auch wenn die Kosten für die Abstraktion ungleich Null sind,
beweisen Sie, dass sie nicht akzeptabel sind, bevor Sie sie aufgeben.)
Abgesehen von einigen kürzlich hinzugefügten Elementen war <algorithm> von Anfang an in der Standardbibliothek enthalten. Wenn Sie sich jedoch den Code ansehen, stellt sich heraus, dass die Leute es oft vorziehen, Schleifen manuell zu schreiben. Die Gründe reichen von der Unkenntnis der verfügbaren Standardalgorithmen bis zur Annahme, dass „Vorlagen zu langsam sind“ (oft ohne Erklärung im Vergleich zu was).
Kompilierungsphase programmieren
Dinge wie Metaprogrammierung mit Vorlagen werden seit C ++ 98 verwendet. Die zur Kompilierungszeit ausgeführte Logik kann die Komplexität zur Laufzeit erheblich reduzieren. In der Vergangenheit war die Verwendung unpraktisch. Die Syntax der Vorlagen unterscheidet sich in Richtung der Komplexität von den Funktionen, die in den neuesten Standards enthalten sind. Dies ist so etwas wie eine separate Sprache, die wir lernen müssen. Dinge wie das Versenden von Tags oder Merkmale sind jedoch nicht zu kompliziert zu verwenden und zu schreiben.
Ja, die meisten Merkmale in der Standardbibliothek wurden mit dem Aufkommen von C ++ 11 angezeigt, aber es ist
nicht allzu schwierig, sie an Ihre Bedürfnisse anzupassen, und einige der häufigsten waren in Boost vor C ++ 11. Ich betrachte die Verwendung der Logik der Kompilierungsstufe als Teil des modernen C ++, da sie C ++ vom allgegenwärtigen „C mit Klassen“ trennt.
Fazit
Modernes C ++ bezieht sich nicht auf neue Standards, sondern auf die Art und Weise, wie wir unsere Programme schreiben. Erstens kann C ++ 98 in einem mehr oder weniger modernen Stil geschrieben werden. Zweitens ist „C mit Klassen und bereichsbasierter for-Schleifen“ noch kein modernes C ++. Neue Funktionen der Sprache und der Bibliotheken helfen uns, im Stil von modernem C ++ zu schreiben, aber sie machen unseren Code nicht zu modernem C ++.