noexcept-Spezifizierer
Funktionen als nicht auslösend markieren
noexcept-Spezifizierer ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Was noexcept zusichert
Der noexcept-Spezifizierer verspricht, dass eine Funktion keine Ausnahme auslöst. Falls sie es dennoch tut, ruft das Programm std::terminate auf.
#include <iostream>
int square(int x) noexcept {
return x * x;
}
int main() {
std::cout << square(5) << "\n";
}Warum das wichtig ist
Wenn bekannt ist, dass eine Funktion keine Ausnahme auslösen kann, können Compiler und Bibliothek optimieren – beispielsweise beim Vergrößern eines Containers Moves statt Kopien verwenden.
Move-Operationen sollten noexcept sein
std::vector verwendet Ihren Move-Konstruktor bei einer Reallokation nur dann, wenn er noexcept ist; andernfalls kopiert der Container aus Sicherheitsgründen. Markieren Sie Moves daher mit noexcept.
struct Buffer {
int* p;
Buffer(Buffer&& o) noexcept : p(o.p) { o.p = nullptr; }
};Destruktoren sind standardmäßig noexcept
Seit C++11 sind Destruktoren implizit noexcept. Wenn eine Ausnahme aus einem Destruktor entweicht, wird das Programm beendet.
Bedingtes noexcept
noexcept(expr) macht die Zusicherung von einem booleschen Wert zur Compilezeit abhängig – nützlich in Templates, die die Zusicherung eines anderen Typs weitergeben.
template <class T>
void swapValues(T& a, T& b) noexcept(noexcept(T(std::move(a)))) {
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}Mit dem noexcept-Operator prüfen
noexcept(expr) liefert als Operator true, wenn für den Ausdruck deklariert ist, dass er keine Ausnahme auslöst – praktisch in Templates.
#include <iostream>
int f() noexcept { return 1; }
int g() { return 2; }
int main() {
std::cout << noexcept(f()) << " " << noexcept(g()) << "\n"; // 1 0
}noexcept ist Teil des Typs
Seit C++17 ist noexcept Teil des Typs eines Funktionszeigers, sodass eine Funktion, die Ausnahmen auslösen kann, nicht an einen noexcept-Zeiger gebunden werden kann.
Nicht zu viel versprechen
Markieren Sie eine Funktion nur dann mit noexcept, wenn Sie sicher sind, dass sie keine Ausnahme auslösen kann. Ein falsches Versprechen, das verletzt wird, bringt das gesamte Programm zum Absturz.
Geeignete Kandidaten
Swaps, Moves, Destruktoren, einfache Getter und Hilfsfunktionen für arithmetische Operationen sind typische noexcept-Funktionen.
noexcept und throw()
Die alte dynamische throw()-Spezifikation ist veraltet und wurde entfernt. Verwenden Sie stattdessen in modernem C++ noexcept.
Leistung und Sicherheit
noexcept dokumentiert sowohl die Absicht als auch und ermöglicht Optimierungen wie Moves bei einer Reallokation – eine kleine Annotation mit großer Wirkung.
Kurze Überprüfung
Testen Sie Ihr Verständnis von noexcept.
Zusammenfassung
Sie haben gelernt, dass der noexcept-Spezifizierer das Ausbleiben von Ausnahmen verspricht und dadurch Optimierungen wie Moves bei einer Reallokation ermöglicht. Markieren Sie Moves, Swaps und Destruktoren mit noexcept, verwenden Sie bedingte Formen in Templates und versprechen Sie nie mehr, als Sie halten können.
Häufig gestellte Fragen
Ist die Lektion „noexcept-Spezifizierer“ kostenlos?
Ja — der vollständige Text von „noexcept-Spezifizierer“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „noexcept-Spezifizierer“?
Funktionen als nicht auslösend markieren Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C++ Academy zu starten?
Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „noexcept-Spezifizierer“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?
Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- try, catch, throw
- Exception-Sicherheit
- noexcept-Spezifizierer
- Benutzerdefinierte Exception-Typen