Herb Sutter:
"The world is built on C++ (and its C subset)"
Modern C++ mag möglicherweise für den einen oder anderen Entwickler durch seine Komplexität etwas abschreckend wirken.
Abbildung 1: Modern C++ – Relax!
(Don’t Trust a Programmer Who Knows C++)
Nichtsdestotrotz ist diese Programmiersprache aus der systemnahen Software-Entwicklung und vielen anderen Einsatzbereichen nicht mehr wegzudenken. C++ zählt zu den Programmiersprachen, die ein etwas tieferes Verständnis erfordern. Ziel dieses Seminars/Repositories ist es, auf die größten Hürden beim Erlernen von Modern C++ einzugehen!
Abbildung 2: We get the Job done – :)
(How To Build A Horse With Programming)
C++ ist eine high-level, general-purpose Programmiersprache, die von Bjarne Stroustrup als Erweiterung der Programmiersprache C erfunden wurde. Cfront war der ursprüngliche Compiler für C ++ – damals bekannt als „C with Classes” – aus der Zeit um 1983, der C ++ in C konvertierte. Entwickelt wurde der Übersetzer von Bjarne Stroustrup bei AT&T Bell Labs.
Die Sprache hat sich im Laufe der Zeit erheblich erweitert, und modernes C++ verfügt jetzt über objektorientierte, generische und funktionale Möglichkeiten sowie über Funktionen zur Low-Level Speichermanipulation. Es wird fast immer als kompilierte Sprache implementiert, und viele Anbieter bieten für C++ Compiler an, darunter die Free Software Foundation, LLVM, Microsoft, Intel, Oracle und IBM. C++ ist daher auf sehr vielen Plattformen verfügbar.
Einen genauen Abriss zur geschichtlichen Entwicklung von C++ kann man hier nachlesen.
Bemerkung:
Die Betreiber des monatlich erscheinenden TIOBE Programming Community Index haben im Januar 2023 die Programmiersprache des Jahres 2022 bekannt gegeben. Den Titel erhält jeweils die Sprache, die im Verlauf des Jahres den höchsten Zuwachs im Ranking zu verzeichnen hat. Nach Python im Jahr 2021 steht nun C++ auf dem Thron für 2022:
Abbildung 3: Die Rangfolge der ersten zehn Programmiersprachen auf Basis des TIOBE Programming Community Index im Januar 2023.
Der Grund für die Beliebtheit von C++ liegt laut TIOBE „in seiner hervorragenden Leistung und der Tatsache, dass es sich um eine objektorientierte Hochsprache handelt. Daher ist es möglich, schnelle und umfangreiche Softwaresysteme (über Millionen von Codezeilen) in C++ zu entwickeln, ohne zwangsläufig in einem Wartungsalptraum zu enden.”
Es ist nicht einfach, bei der Menge an sprachlichen Ergänzungen, Erweiterungen und Neuerungen von C++ den Überblick zu behalten. Das von mir zusammengestellte Inhaltsverzeichnis unternimmt den Versuch, den größten Teil dieser Weiterentwicklung zumindest nach gewissen systematischen und methodischen Gesichtspunkten so zu gliedern und zusammenzufassen, dass bei deren Betrachtung der „rote Faden” nicht verloren geht.
Einige kleinere Aufgaben (samt Musterlösungen) sind diesem Repository ebenfalls beigefügt. Sie können bei weitem nicht den gesamten Stoffumfang des Modern C++ Sprachumfangs abdecken, dienen aber dem Zweck, die „graue Materie” an der einen oder anderen Stelle etwas aufzuhellen:
Online C++ Compiler können nützliche Werkzeuge sein, um ein Code-Snippet schnell kompilieren und/oder ausführen zu können, ohne hierfür extra einen C++ Compiler installieren zu müssen. Besonders nützlich können Online Compiler sein, um mit den neuesten Sprachfeatures zu spielen oder auch um verschiedene Compiler vergleichen zu können.
Jedes Jahr gibt es immer noch zahlreiche Neuerscheinungen zum Thema C++, die auf den Markt kommen. Sich aus der Fülle an alter und neuer C++-Literatur für einen Titel zu entscheiden, fällt oftmals gar nicht so leicht. Aus diesem Grund habe ich im Folgenden eine Liste mit Büchern zusammengestellt, die bei mir derzeit hoch im Kurs stehen und meiner Meinung nach absolut lesenswert sind.
In diesem Projekt sind zahlreiche kleinere Code-Snippets abgelegt, um die diversen Features von C++–11/14/17 demonstrieren zu können. Es folgt eine tabellarische Auflistung dieser Unterverzeichnisse.
Unterverzeichnis | Thematik |
---|---|
Accumulate | STL-Algorithmus std::accumulate und Lambda-Objekte in der Anwendung |
Allocator | Container und Speicher-Allokatoren |
Any | Neue STL-Utility Klasse std::any |
Apply | std::apply , std::integer_sequence und std::make_integer_sequence |
ArgumentDependentNameLookup | Argument-Dependent Name Lookup (ADL) / Koenig-Lookup |
Array | Neue STL-Utility Klasse std::array , Hilfsfunktion std::to_array und Hilfsklasse std::span |
ArrayDecay | Arrays und Pointer |
Attributes | C++ Standard Attribute |
Auto | Keyword auto |
BackInserter | std::back_inserter Iterator |
Bind | std::bind |
BraceInitialization | Einheitliches Initialisierungs-Konzept |
Casts | Typumwandlungen static_cast , dynamic_cast , const_cast und reinterpret_cast |
CommonType | Utility std::common_type |
Concepts/Requires/Classes | Konzepte (Concepts) und Einschränkungen (Requirements) für Klassen |
Concepts/Requires/Functions | Konzepte (Concepts) und Einschränkungen (Requirements) für Funktionen |
ConstExpr | Programmierung zur Übersetzungszeit mit constexpr |
Const | const , constexpr , consteval und constinit |
ConstructorsOrder | Reihenfolge der Aufrufe von Konstruktoren und Destruktoren |
Copy/Move Elision | Auslassen von Kopier- oder Verschiebe-Operationen |
CRTP | Curiously Recurring Template Pattern (CRTP) |
DeclType | decltype und std::declval |
DefaultInitialization | Default-Initialisierung für Member-Variablen |
Erase-Remove Idiom | Das Erase-Remove-Idiom |
Explicit | Schlüsselwort explicit |
ExpressionTemplates | Expression Templates |
Folding | Folding Expressions |
FunctionalProgramming | Funktionale Programmierung |
Generate | STL-Algorithmus std::generate |
GenericLambdas | Generische Lambda Ausdrücke |
InitializerList | Klasse std::initializer_list<T> |
InputOutputStreams | Streams manipulieren und formatieren |
Invoke | std::invoke : "Uniformly invoking anything callable" |
Lambda | Lambda-Objekte |
Literals | Benutzerdefinierte Literale |
MemoryLeaks | CRT (C-Runtime-Library) Memory Leak Detection |
MetaProgramming | Programmierung zur Übersetzungszeit |
ModularizedStandardLibrary | Modularisierte Standardbibliothek |
Modules | Module |
MoveSemantics | Move Semantics / Verschiebesemantik |
Optional | Neue STL-Utility Klasse std::optional |
ParametersWithConstAndRef | Die Deklarationen int& const , int const& , const& int und const int& im Vergleich |
PerfectForwarding | Perfect Forwarding (std::forward ) |
PlacementNew | Placement New: Trennung von Speicherallokation und Objektkonstruktion |
RAII | RAII-Idiom (Resource acquisition is Initialization) |
Random | Generierung von Zufallszahlen |
RangeBasedForLoop | Range-based for Loop |
ReferenceWrapper | Klasse std::reference_wrapper und Funktion std::ref |
RegExpr | Reguläre Ausdrücke |
RValueLValue | LValue- und RValue Referenzen |
SFINAE_EnableIf | SFINAE und std::enable_if |
SharedPointer | Klasse std::shared_ptr<T> |
SourceLocation | Klasse std::source_location |
SSO | Small String Optimization |
StaticAssert | Compile-Time Makro static_assert |
StringView | Klasse std::string_view |
StructuredBinding | Verknüpfung einer Liste von Bezeichnern mit einem Satz von Objekten (Variablen) |
TemplatesFunctionBasics | Grundlagen zu Funktions-Templates |
TemplatesClassBasics | Grundlagen zu Klassen-Templates |
TemplateSpecialization | Template Spezialisierung |
TemplateConstexprIf | Templates und bedingte Compilierung (if constexpr ) |
TemplateTemplateParameter | Template Template Parameter |
TemplateTwoPhaseLookup | Two-Phase Name Lookup |
ToUnderlying | Funktion std::to_underlying |
Transform | STL-Algorithmus std::transform und Lambda-Objekte in der Anwendung |
TrimmingStrings | Leerzeichen am Anfang und Ende einer Zeichenkette entfernen |
Tuples | Neue STL-Utility Klasse std::tuple |
TypeErasure | Type Erasure – statischer versus dynamischer Polymorphismus |
TypeTraits | Typmerkmale |
UniquePointer | Klasse std::unique_ptr<T> |
UsingNamespaceStd | Warum ist using namespace std; als schlechte Praxis angesehen? |
VariadicTemplates | Templates mit variabler Argumentanzahl (Variadische Templates) |
Variant | Neue STL-Utility Klasse std::variant |
VirtualBaseClassDestructor | Virtuelle Destruktoren (einer Basisklasse) |
VirtualOverrideFinal | Neue Schlüsselwörter override und final |
WeakPointer | Klasse std::weak_ptr<T> |
Tabelle 1. Tabellarische Auflistung aller Modern C++–Beispiele dieses Repositories.