
C++-Schlüsselwörter sind sprachlich reserviertespezielle Wörter, die nicht als Variablennamen, Funktionsnamen usw. verwendet werden können. Sie steuern das Verhalten, die Typen und den Ablauf von Programmen.
1. Grundlegende Datentypen (am häufigsten verwendet)
| Schlüsselwort | Bedeutung (für Anfänger) | Beispiel / Beschreibung | Hinweise |
|---|---|---|---|
| bool | Boolescher Typ, nur true / false | bool ok = true; |
Kern der Bedingungsprüfung |
| char | Einzelzeichen (normalerweise 1 Byte) | char c = 'A'; |
Einfache Anführungszeichen verwenden |
| wchar_t | Breitzeichen (oft verwendet, um Chinesisch usw. zu unterstützen) | wchar_t wc = L'中'; |
2 oder 4 Bytes, plattformabhängig |
| char8_t | UTF-8-Zeichen (neu in C++20) | char8_t c8 = u8'好'; |
Moderne Unicode-Programmierung |
| char16_t | UTF-16-Zeichen (C++11) | ||
| char32_t | UTF-32-Zeichen (C++11) | ||
| int | Ganzzahl (normalerweise 4 Bytes) | int age = 18; |
Am häufigsten verwendeter Ganzzahltyp |
| short | Kurze Ganzzahl (normalerweise 2 Bytes) | short s = 1000; |
Verwenden, wenn Speicherplatz gespart werden soll |
| long | Lange Ganzzahl (mindestens 4 Bytes, häufig 8 Bytes) | long l = 1234567890L; |
L-Suffix hinzufügen |
| long long | Längere Ganzzahl (mindestens 8 Bytes, in C++11 formalisiert) | long long big = 1LL<<60; |
Große Zahlen verarbeiten |
| float | Gleitkommazahl mit einfacher Genauigkeit | float f = 3.14f; |
f-Suffix anhängen |
| double | Gleitkommazahl mit doppelter Genauigkeit (Standard-Gleitkommatyp) | double pi = 3.1415926535; |
Höhere Genauigkeit |
| void | Kein Typ (Funktionen ohne Rückgabewert, generische Zeiger usw.) | void func(); |
Häufig in Funktionsdeklarationen verwendet |
| unsigned | Unsigned (kombiniert mit int/long usw.) | unsigned int id = 4000000000u; |
Größerer Wertebereich, kann aber keine negativen Zahlen darstellen |
2. Lebensdauer und Speicherung von Variablen/Objekten (Speicherung & Dauer)
| Schlüsselwort | Bedeutung (für Anfänger) | Beispiel / Häufige Verwendung | Moderne Empfehlung |
|---|---|---|---|
| auto | Den Compiler den Typ automatisch ableiten lassen (die wichtigste Verwendung nach C++11) | auto x = 3.14; → double |
Sehr empfohlenam häufigsten beim Schreiben von Code verwendet |
| const | Konstante, kann nicht geändert werden | const int MAX = 100; |
Sicherer als #define, besitzt Typprüfung |
| static | Statische Speicherung (innerhalb einer Datei geteilt, unter Klassenmembern geteilt, behält den Wert innerhalb einer Funktion) | static int count = 0; |
Statische Klassenmember müssen außerhalb der Klasse initialisiert werden |
| extern | Deklariert Variablen/Funktionen, die anderswo definiert sind (dateiübergreifende Verwendung) | extern int globalVar; |
Häufig in Multidatei-Projekten verwendet |
| thread_local | Jeder Thread hat seine eigene Kopie (C++11) | Multithread-Programmierung | |
| Register | Empfohlen, in einem Register abzulegen (moderne Compiler ignorieren dies im Grunde) | Im Grunde nicht verwendet, veraltet | |
| mutable | Ermöglicht einer const-Member-Funktion, dieses Member zu ändern | Spezielles Szenario innerhalb einer Klasse |
3. Klassen und Kern der objektorientierten Programmierung (OOP-Grundlagen)
| Schlüsselwort | Bedeutung (für Anfänger) | Beispiel / Beschreibung | Bedeutung |
|---|---|---|---|
| class | Definiert eine Klasse (standardmäßig private) | class Student { ... }; |
★★★★★ |
| struct | Definiert ein struct (standardmäßig public, kompatibel mit C) | struct Point { int x,y; }; |
★★★★ |
| public | Public-Member, auf die jeder zugreifen kann | ||
| private | Private Member, auf die nur diese Klasse und Friends zugreifen können | ||
| protected | Protected Member, auf die diese Klasse + abgeleitete Klassen + Friends zugreifen können | ||
| this | Zeiger auf das aktuelle Objekt | this->age = 18; |
Wird oft verwendet, um Parameter mit demselben Namen zu unterscheiden |
| friend | Friend (ermöglicht Zugriff auf private/protected) | friend class Utils; |
Wird selten verwendet; mit Vorsicht einsetzen, da es die Kapselung durchbricht |
| virtual | Virtuelle Funktion (implementiert Polymorphismus) | virtual void draw() = 0; |
Kern des Polymorphismus |
| override | Explizit deklarieren, dass dies ein override ist (C++11, empfohlen hinzuzufügen) | void draw() override; |
Verhindert Tippfehler |
| final | Vererbung verbieten / Überschreiben verbieten (C++11) | class My final {} |
Klare Designabsicht |
| explicit | Implizite Konvertierung verbieten (am häufigsten bei Konstruktoren mit einem Argument) | explicit MyClass(int x); |
Verhindert versehentliche Konvertierungen |
4. Speicherverwaltung und Zeiger
| Schlüsselwort | Bedeutung (für Anfänger) | Beispiel / Beschreibung | Moderne Empfehlung |
|---|---|---|---|
| new | Speicher dynamisch reservieren (gibt einen Zeiger zurück) | int* p = new int(5); |
Versuchen Sie, Smart Pointer zu verwenden |
| Löschen | Mit new zugewiesenen Speicher freigeben | delete p; delete[] arr; |
Paarweise verwenden, um Speicherlecks zu vermeiden |
| nullptr | Nullzeiger-Konstante (C++11, empfohlener Ersatz für NULL) | int* ptr = nullptr; |
Sehr zu empfehlen |
5. Typumwandlung (4 Casts, abnehmende Sicherheit)
| Schlüsselwort | Bedeutung (für Anfänger) | Sicherheit | Empfohlene Anwendungsfälle |
|---|---|---|---|
| static_cast | Compile-Time-Konvertierung (verwandte Typen, numerische Konvertierungen, usw.) | Hoch | Am häufigsten im Arbeitsalltag verwendet |
| const_cast | const oder volatile hinzufügen/entfernen | Mittel | Selten verwendet, gefährlich |
| dynamic_cast | Laufzeitsicheres Downcasting (polymorphe Klassen) | Hoch | Typprüfung in Vererbungshierarchien |
| reinterpret_cast | Low-Level- und gefährliche Bitmuster-Neuinterpretation (beliebige Konvertierung zwischen Zeigern) | Niedrig | Selten verwendet (z. B. Hardware-Interaktion) |
6. Kontrollfluss (Grundlegendstes)
| Schlüsselwort | Bedeutung (für Anfänger) | Beispiel |
|---|---|---|
| if / else | Bedingte Anweisung (ausführen, wenn die Bedingung erfüllt ist, andernfalls einen anderen Teil ausführen) | int a = 8; if (a > 10) { cout << "大于10"; } else { cout << "不大于10"; } |
| switch | Mehrfachverzweigung (unterstützt nur Integer-/Enum-/Char-Typen) | int score = 9; switch (score) { case 9: cout << "优秀"; break; default: cout << "普通"; } |
| case / default | Verzweigungsmarkierungen in switch (case passt auf einen Wert, default passt auf alle nicht übereinstimmenden Fälle) | char ch = 'a'; switch (ch) { case 'a': cout << "字母A"; break; default: cout << "其他字符"; } |
| for | Zähl-/Bereichsschleife (geeignet für Szenarien mit bekannter Anzahl von Iterationen) | for (int i=0; i<10; i++) { cout << i; }(Zählschleife)vector<int> v={1,2,3}; for (int num : v) { cout << num; }(Range-Schleife) |
| while | Erst prüfen, dann ausführen (unbekannte Anzahl von Iterationen; Schleife nur, solange die Bedingung erfüllt ist) | int i=1; while (i<=5) { cout << i; i++; } |
| do | Mindestens einmal ausführen, dann prüfen (unbekannte Anzahl von Iterationen; stellt die erste Ausführung sicher) | int i=1; do { cout << i; i++; } while (i<=5); |
| break | Aus der aktuellen Schleife bzw. dem switch-Zweig ausbrechen (beendet sofort, führt nachfolgenden Inhalt nicht aus) | for (int i=0; i<10; i++) { if (i==5) break; cout << i; }(aus der Schleife ausbrechen)switch (score) { case 9: break; }(aus dem switch-Zweig ausbrechen) |
| continue | Den restlichen Teil der aktuellen Schleifeniteration überspringen und direkt zur nächsten Iteration übergehen | for (int i=0; i<10; i++) { if (i%2==0) continue; cout << i; }(nur ungerade Zahlen ausgeben) |
| return | Das Funktionsergebnis zurückgeben (bei Funktionen mit Rückgabewert) oder eine void-Funktion vorzeitig beenden | int add(int a, int b) { return a + b; }(das Funktionsergebnis zurückgeben)void print() { if (1) return; cout << "此行不会执行"; }(eine void-Funktion vorzeitig beenden) |
7. Ausnahmebehandlung (Im modernen C++ noch üblich, aber nicht die erste Wahl)
try / catch / throw
8. Templates und moderne generische Programmierung (Mittelstufe/Fortgeschritten)
template、typename、concept(C++20)、requires(C++20)
9. Weitere wichtige, aber seltener verwendete Schlüsselwörter
- constexpr(C++11): Konstanten/Funktionen zur Compile-Zeit
- inlineEmpfiehlt Funktions-Inlining (wird in modernem C++ oft bei Definitionen in Header-Dateien verwendet)
- enumAufzählung (moderne Empfehlung: enum class)
- namespace / usingNamespace-Verwaltung
- sizeofErmittelt die Byte-Größe eines Typs/Objekts
- typeidLaufzeit-Typinformation (selten verwendet)
- asmInline-Assembler (selten verwendet)
- gotoSprung (stark nicht empfohlen, bricht die Struktur)
- exportTemplate-Export vor C++20 (mittlerweile praktisch nutzlos)
Beispiele
1. auto (Automatische Typableitung)
Lass den Compiler den Typ für dich schreiben, wodurch der Code prägnanter und weniger fehleranfällig wird.
Beispiele
#include <vector>
#include <string>
int main() {
auto a = 42; // als int abgeleitet
auto b = 3.14; // als double abgeleitet
auto c = "hello"; // als const char* abgeleitet
auto d = std::string("world"); // als std::string abgeleitet
auto vec = std::vector{1, 2, 3}; // als std::vector<int> abgeleitet
std::cout << a << " " << b << " " << c << " " << d << "\n";
for (auto x : vec) { // auto wird häufig in bereichsbasierten for-Schleifen verwendet
std::cout << x << " ";
}
std::cout << "\n";
}
Ausgabe:
42 3.14 hello world 1 2 3
2. const (Konstante)
Schütze Variablen vor versehentlicher Änderung, schreibe sichereren Code.
Beispiele
int main() {
const int MAX = 100; // Muss initialisiert werden, kann nicht geändert werden
// MAX = 200; // Fehler! Kann nicht geändert werden
const double PI = 3.14159;
std::cout << "π ≈ " << PI << "\n";
int x = 10;
const int* p = &x; // Der Inhalt, auf den der Zeiger zeigt, kann nicht geändert werden
// *p = 20; // Fehler!
x = 30; // Aber x selbst kann geändert werden
std::cout << *p << "\n";
}
圆周率 ≈ 3.14159 30
3. static (Statisch)
Lassen Sie Variablen "länger leben", häufig zum Zählen und Teilen von Daten verwendet.
Beispiele
void counter() {
static int count = 0; // Wird nur einmal initialisiert, nicht zerstört, wenn die Funktion endet
count++;
std::cout << "Aufruf " << count << " Mal"\n";
}
int main() {
counter(); // 1
counter(); // 2
counter(); // 3
}
Ausgabe:
第 1 次调用 第 2 次调用 第 3 次调用
4. nullptr (Moderner Nullzeiger)
Sicherer und klarer als NULL, wodurch Typverwechslungen vermieden werden.
Beispiele
int main() {
int* p1 = NULL; // Alter Stil (nicht empfohlen)
int* p2 = nullptr; // Empfohlener moderner C++-Ansatz
if (p2 == nullptr) {
std::cout << "p2 ist ein Nullzeiger\n";
}
// nullptr kann nur Zeigern zugewiesen werden, nicht Ganzzahlen
// int x = nullptr; // Fehler!
}
Ausgabe:
p2 是空指针
5. Bereichsbasierte for-Schleife (for(auto : ) Range-for-Schleife)
Die einfachste und sicherste Möglichkeit, über Container zu iterieren.
Beispiele
#include <vector>
int main() {
std::vector<int> scores {85, 92, 78, 95};
// Traditioneller Ansatz
for (size_t i = 0; i < scores.size(); ++i) {
std::cout << scores[i] << " ";
}
std::cout << "\n";
// Moderner Ansatz (empfohlen)
for (auto score : scores) {
std::cout << score << " ";
}
std::cout << "\n";
// Wenn Sie Elemente ändern müssen, verwenden Sie eine Referenz
for (auto& score : scores) {
score += 5;
}
for (auto score : scores) {
std::cout << score << " ";
}
}
Ausgabe:
85 92 78 95 85 92 78 95 90 97 83 100
6. explicit (Implizite Konvertierung verhindern)
Verhindert Fehler durch versehentliche Typkonvertierungen; das Hinzufügen von explicit ist strenger.
Beispiele
class Distance {
private:
double meters;
public:
// explicit Distance(double m) : meters(m) {} // Das Hinzufügen von explicit ist sicherer
Distance(double m) : meters(m) {} // Ohne dies erfolgt eine implizite Konvertierung
double get() const { return meters; }
};
void print(double d) {
std::cout << "Entfernung: " << d << " Meter\n";
}
int main() {
Distance d = 500; // Wenn der Konstruktor nicht explicit ist, ist dies erlaubt
print(d); // Konvertiert Distance implizit → double
// print(500); // Wenn explicit hinzugefügt wird, verursacht diese Zeile einen Fehler
}
Ausgabe (ohne explicit):
距离: 500 米
7. override (Virtuelle Funktionen explizit überschreiben)
Das Schreiben von override ermöglicht es dem Compiler zu prüfen, ob du tatsächlich eine virtuelle Funktion überschrieben hast.
Beispiele
class Animal {
public:
virtual void speak() const {
std::cout << "Ein Tiergeräusch\n";
}
};
class Dog : public Animal {
public:
void speak() const override { // Das Hinzufügen von override ist am sichersten
std::cout << "Wau wau wau!\n";
}
};
int main() {
Animal* pet = new Dog();
pet->speak();
delete pet;
}
Ausgabe:
Woof woof woof!
8. constexpr (Berechnung zur Compile-Zeit)
Berechnungen zur Compile-Zeit durchführen, wodurch Programme schneller und sicherer werden.
Beispiele
constexpr int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
int main() {
constexpr int f5 = factorial(5); // Zur Kompilierzeit als 120 berechnet
std::cout << "5! = " << f5 << "\n";
int x = 6;
// constexpr int f6 = factorial(x); // Fehler! x ist keine Konstante
std::cout << "6! = " << factorial(x) << "\n"; // Berechnung zur Laufzeit funktioniert ebenfalls
}
Ausgabe:
5! = 120 6! = 720
9. using (Namensraum + Typalias)
using vereinfacht Namensräume und erstellt lesbare Typaliase.
Beispiele
#include <vector>
// Traditionelles typedef
typedef std::vector<int> IntVec;
// Modernes using (flexibler, kann als Template verwendet werden)
using StringVec = std::vector<std::string>;
int main() {
using std::cout; // Nur cout importieren
using std::endl;
IntVec v1 {1, 2, 3};
StringVec v2 {"Apple", "Banana"};
cout << v1.size() << " " << v2.size() << endl;
}
Ausgabe:
3 2
10. enum class (stark typisierte Enumeration)
Sicherer als ein einfaches enum, wird nicht versehentlich mit Ganzzahlen vermischt.
Beispiele
enum class Color { Red, Green, Blue }; // Stark typisiert, wird nicht implizit in int konvertiert
int main() {
Color c = Color::Green;
// if (c == 1) {} // Fehler! Kann nicht direkt mit int verglichen werden
if (c == Color::Green) {
std::cout << "ist grün\n";
}
// Muss explizit in int konvertiert werden
std::cout << "Zugrunde liegender Wert: " << static_cast<int>(c) << "\n";
}
Ausgabe:
是绿色 底层值: 1