RAII und Ausnahmesicherheit
Resource Acquisition Is Initialization (RAII) ist ein zentrales C++-Konzept. Ressourcen sind an die Lebensdauer von Objekten gebunden; sie werden im Konstruktor angefordert und im Destruktor freige…
Snippet öffnen →Lies diese C++-Snippets für Fortgeschrittene Zeile für Zeile — jedes kommt mit einer Erklärung, was der Code tut und warum.
Resource Acquisition Is Initialization (RAII) ist ein zentrales C++-Konzept. Ressourcen sind an die Lebensdauer von Objekten gebunden; sie werden im Konstruktor angefordert und im Destruktor freige…
Snippet öffnen →Wenn man in C++ ein Objekt einer abgeleiteten Klasse über einen Basisklassen-Zeiger löscht, ist das Verhalten undefiniert, sofern die Basisklasse keinen virtuellen Destruktor hat. Das Schlüsselwort…
Snippet öffnen →Die Move-Semantik ermöglicht es, Ressourcen (wie Heap-Speicher) von einem Objekt auf ein anderes zu übertragen, anstatt sie zu kopieren. std::move wandelt ein Objekt in einen R-Value um, sodass der…
Snippet öffnen →std::unique_ptr ist ein intelligenter Zeiger, der ein anderes Objekt besitzt und verwaltet und dieses Objekt löscht, sobald der unique_ptr den Gültigkeitsbereich verlässt. Er kann nicht kopiert, so…
Snippet öffnen →Lambdas sind anonyme Funktionen, die inline definiert werden können. Die Capture-Klausel '[]' ermöglicht es dem Lambda, auf Variablen aus dem umgebenden Bereich zuzugreifen, entweder als Kopie oder…
Snippet öffnen →Statische Elemente werden von allen Instanzen einer Klasse gemeinsam genutzt. Es gibt nur eine Kopie eines statischen Elements, unabhängig davon, wie viele Objekte erstellt werden.
Snippet öffnen →Die Template-Spezialisierung ermöglicht es Ihnen, eine benutzerdefinierte Implementierung eines Templates für einen bestimmten Datentyp zu definieren und so die generische Version zu überschreiben.
Snippet öffnen →Die Operatorüberladung ermöglicht es Ihnen, das Verhalten von Standardoperatoren wie + oder - bei der Verwendung mit Ihren eigenen Klassen neu zu definieren.
Snippet öffnen →Elementinitialisierungslisten werden in Konstruktoren verwendet, um Klassenelemente zu initialisieren, bevor der Konstruktorrumpf ausgeführt wird, was effizienter ist als eine Zuweisung.
Snippet öffnen →Das Schlüsselwort mutable erlaubt es, ein bestimmtes Element einer Klasse zu ändern, selbst wenn auf das Objekt über eine const-Referenz oder innerhalb einer const-Memberfunktion zugegriffen wird.
Snippet öffnen →Durch die Implementierung der Methoden begin() und end(), die Pointer (oder Iteratoren) zurückgeben, ermöglichen Sie die Verwendung Ihrer benutzerdefinierten Klassen in C++-bereichsbasierten for-Sc…
Snippet öffnen →Im Gegensatz zu herkömmlichen Enums im C-Stil verhindert 'enum class' Namenskollisionen und versehentliche implizite Konvertierungen in Integer, was eine stärkere Typsicherheit bietet.
Snippet öffnen →Dynamische 2D-Arrays werden erstellt, indem ein Array von Pointern zugewiesen wird, wobei jeder Pointer wiederum ein Array von Werten auf dem Heap zugewiesen bekommt.
Snippet öffnen →Beim Iterieren über Container mit Objekten wie Strings vermeidet die Verwendung einer 'const reference' teure Kopieroperationen bei jeder Iteration.
Snippet öffnen →Die Kombination 'static constexpr' ermöglicht es, Konstanten auf Klassenebene zu definieren, die zur Kompilierzeit ausgewertet und von allen Instanzen gemeinsam genutzt werden.
Snippet öffnen →Standard-C++-Ganzzahltypen wie 'int' oder 'long' können in ihrer Größe zwischen Architekturen variieren. Der Header <cstdint> bietet Aliase wie int32_t oder uint64_t an, die eine spezifische Bitbre…
Snippet öffnen →C++17 führte die Möglichkeit ein, eine Variable direkt innerhalb der Bedingung einer 'if'- oder 'switch'-Anweisung zu initialisieren. Dies beschränkt den Gültigkeitsbereich der Variablen auf den Bl…
Snippet öffnen →Im Gegensatz zu rohen Arrays im C-Stil ist std::array ein vollwertiger Container, der nicht automatisch zu einem Zeiger verfällt. Er kennt seine eigene Größe und unterstützt die Standard-Iterator-S…
Snippet öffnen →Die 'if constexpr'-Anweisung ermöglicht bedingte Kompilierung. Zweige, die die Bedingung nicht erfüllen, werden vom Compiler nicht instanziiert. Dies ist äußerst nützlich für die Template-Metaprogr…
Snippet öffnen →Während der Subskript-Operator [] schnell ist, führt er keine Grenzwertprüfung durch, was bei ungültigen Indizes zu undefiniertem Verhalten führt. Die von Standard-Containern bereitgestellte at()-M…
Snippet öffnen →Dieses fortgeschrittene Kontrollflussmuster verwendet ein logisches UND, um Pufferüberläufe während der Iteration zu verhindern. Es stellt sicher, dass der Speicherzugriff nur erfolgt, wenn der Ind…
Snippet öffnen →Enum-Klassen (Scoped Enums) bieten eine bessere Typsicherheit als herkömmliche Enums, indem sie implizite Konvertierungen in Ganzzahlen verhindern. Die Angabe des zugrunde liegenden Typs wie 'unsig…
Snippet öffnen →In C++ verfallen Arrays in Pointer auf ihr erstes Element. Pointer-Arithmetik ermöglicht es Ihnen, durch das Array zu navigieren, indem Sie Offsets zur Basisadresse hinzufügen, was ein grundlegende…
Snippet öffnen →Die do-while-Schleife garantiert mindestens eine Ausführung des Codeblocks, da die Bedingung erst nach dem Rumpf ausgewertet wird. Dies ist nützlich für Aufgaben wie die Eingabevalidierung, bei den…
Snippet öffnen →Mehrdimensionale Arrays werden in C++ in Zeilen-Hauptreihenfolge (row-major order) gespeichert. Das bedeutet, dass alle Elemente einer Zeile im Speicher zusammenhängen. Verschachtelte Schleifen sin…
Snippet öffnen →Im Gegensatz zu rohen C-Arrays ist std::array ein Container, der seine eigene Größe kennt und nicht automatisch in einen Pointer zerfällt. Es bietet eine robustere Methode zum Umgang mit Sammlungen…
Snippet öffnen →Strukturierte Bindungen (C++17) ermöglichen es, komplexe Datentrukturen wie Pairs oder Tuples direkt in einzelne Variablen innerhalb eines Schleifenkopfs zu entpacken. Dies verbessert die Lesbarkei…
Snippet öffnen →Die Verwendung von static_cast für die Typumwandlung wird gegenüber C-Style-Casts bevorzugt, da es im Code besser sichtbar ist und vom Compiler geprüft wird. Es signalisiert anderen Entwicklern, da…
Snippet öffnen →Ein Switch-Fallthrough tritt auf, wenn ein Case nicht mit einem Break endet. Obwohl dies oft ein Bug ist, kann es für hierarchische Logik nützlich sein. Das Attribut [[fallthrough]] teilt dem Compi…
Snippet öffnen →Mehrdimensionale Arrays werden im Speicher zeilenweise (row-major order) abgelegt. Die Initialisierung mit geschachtelten Klammern verbessert die Code-Klarheit, indem die Daten visuell auf ihre log…
Snippet öffnen →