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!
(Credits: 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.
Thema | Kurzbeschreibung |
---|---|
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 |
Argument Dependent Name Lookup | Argument-Dependent Name Lookup (ADL) / Koenig-Lookup |
Array | Neue STL-Utility Klasse std::array , Hilfsfunktion std::to_array und Hilfsklasse std::span |
Array-Decay | Arrays und Pointer |
Attributes | C++ Standard Attribute |
Auto | Keyword auto |
BackInserter | std::back_inserter Iterator |
Bind | std::bind |
Brace Initialization | Einheitliches Initialisierungs-Konzept |
Casts | Typumwandlungen static_cast , dynamic_cast , const_cast und reinterpret_cast |
CommonType | Utility std::common_type |
Concepts for Classes | Konzepte (Concepts) und Einschränkungen (Requirements) für Klassen |
Concepts for Functions | Konzepte (Concepts) und Einschränkungen (Requirements) für Funktionen |
ConstExpr | Programmierung zur Übersetzungszeit mit constexpr |
Const | const , constexpr , consteval und constinit |
Constructors Order | Reihenfolge der Aufrufe von Konstruktoren und Destruktoren |
Copy/Move Elision | Auslassen von Kopier- oder Verschiebe-Operationen |
Copy-Swap Idiom | Das Copy-and-Swap Idiom |
CRTP | Curiously Recurring Template Pattern (CRTP) |
DeclType | decltype und std::declval |
Default Initialization | Default-Initialisierung für Member-Variablen |
Erase-Remove Idiom | Das Erase-Remove-Idiom |
Exception Safety | Ausnahmesicherheit / Exception Safety |
Explicit | Schlüsselwort explicit |
Expression Templates | Expression Templates |
Folding | Folding Expressions |
Functional Programming | Funktionale Programmierung |
Generate | STL-Algorithmus std::generate |
Generic Functions | Generische Funktionen (inkl. Lambdas) |
InitializerList | Klasse std::initializer_list<T> |
Input/Output Streams | Streams manipulieren und formatieren |
Invoke | std::invoke : "Uniformly invoking anything callable" |
Lambda | Lambda-Objekte |
Literals | Benutzerdefinierte Literale |
Memory Leaks | CRT (C-Runtime-Library) Memory Leak Detection |
MetaProgramming | Programmierung zur Übersetzungszeit |
Modularized Standard Library | Modularisierte Standardbibliothek |
Modules | Neues Modul-Konzept |
Move-Semantics | Move Semantics / Verschiebesemantik |
Optional | Neue STL-Utility Klasse std::optional |
Parameters with Const and Reference | Die Deklarationen int& const , int const& , const& int und const int& im Vergleich |
Perfect-Forwarding | Perfect Forwarding (std::forward ) |
Placement-New | Placement New: Trennung von Speicherallokation und Objektkonstruktion |
Println | The Return of „printf ”: std::print(ln) in C++ 23 |
RAII | RAII-Idiom (Resource acquisition is Initialization) |
Random | Generierung von Zufallszahlen |
Range-Based For Loop | Range-based for Loop |
ReferenceWrapper | Klasse std::reference_wrapper und Funktion std::ref |
RegExpr | Reguläre Ausdrücke |
RValue/LValue | LValue- und RValue Referenzen |
SFINAE_EnableIf | SFINAE und std::enable_if |
Shared Pointer | 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 |
Structured Binding | Verknüpfung einer Liste von Bezeichnern mit einem Satz von Objekten (Variablen) |
Templates: FunctioBasics | Grundlagen zu Funktions-Templates |
Templates: Class Basics | Grundlagen zu Klassen-Templates |
Templates: Specialization | Template Spezialisierung |
Templates: ConstexprIf | Templates und bedingte Compilierung (if constexpr ) |
Templates: TemplateParameter | Template Template Parameter |
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 |
Two-Phase Name Lookup | Two-Phase Name Lookup |
TypeErasure | Type Erasure – statischer versus dynamischer Polymorphismus |
TypeTraits | Typmerkmale |
Unique Pointer | Klasse std::unique_ptr<T> |
Using Namespace Std | Warum ist using namespace std; als schlechte Praxis angesehen? |
Variadic Templates | Templates mit variabler Argumentanzahl (Variadische Templates) |
Variant | Neue STL-Utility Klasse std::variant |
Virtual Base Class Destructor | Virtuelle Destruktoren (einer Basisklasse) |
Virtual/Override/Final | Neue Schlüsselwörter override und final |
Weak Pointer | Klasse std::weak_ptr<T> |
Tabelle 1. Tabellarische Auflistung aller Modern C++–Beispiele dieses Repositories.