Skip to content

Collection of examples to illustrate modern C++11/14/17/20 features

Notifications You must be signed in to change notification settings

pelocpp/cpp_modern

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Modern C++

Preamble


Herb Sutter:
"The world is built on C++ (and its C subset)"



Bevor es losgeht ...

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)


Überblick

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.”


Agenda

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.

Zur Agenda.


Aufgaben

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:

Zu den Aufgaben.


Online C++ Compiler

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.

Weitere Details.


Literaturverzeichnis

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.

Zum Literaturverzeichnis.


Katalog aller Modern-C++-Code-Snippets

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.


About

Collection of examples to illustrate modern C++11/14/17/20 features

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages