Skip to content

Collection of examples to illustrate modern C++11/14/17/20/23 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!

(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)


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

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.


About

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

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages