
Ключевые слова C++ — это зарезервированные языкомспециальные слова, которые нельзя использовать в качестве имён переменных, имён функций и т. д. Они управляют поведением, типами и потоком выполнения программ.
1. Основные типы данных (наиболее часто используемые)
| Ключевое слово | Значение (для начинающих) | Пример / Описание | Примечания |
|---|---|---|---|
| bool | Логический тип, только true / false | bool ok = true; |
Основа проверки условий |
| char | Один символ (обычно 1 байт) | char c = 'A'; |
Используйте одинарные кавычки |
| wchar_t | Широкий символ (часто используется для поддержки китайского и т. п.) | wchar_t wc = L'中'; |
2 или 4 байта, зависит от платформы |
| char8_t | Символ UTF-8 (новое в C++20) | char8_t c8 = u8'好'; |
Современное программирование с Unicode |
| char16_t | Символ UTF-16 (C++11) | ||
| char32_t | Символ UTF-32 (C++11) | ||
| int | Целое число (обычно 4 байта) | int age = 18; |
Наиболее часто используемый целочисленный тип |
| short | Короткое целое число (обычно 2 байта) | short s = 1000; |
Используйте для экономии памяти |
| long | Длинное целое число (не менее 4 байт, обычно 8 байт) | long l = 1234567890L; |
Добавьте суффикс L |
| long long | Длинное целое число (не менее 8 байт, формализовано в C++11) | long long big = 1LL<<60; |
Работа с большими числами |
| float | Число с плавающей запятой одинарной точности | float f = 3.14f; |
Добавьте суффикс f |
| double | Число с плавающей запятой двойной точности (тип с плавающей запятой по умолчанию) | double pi = 3.1415926535; |
Более высокая точность |
| void | Отсутствие типа (функции, не возвращающие значение, обобщённые указатели и т. д.) | void func(); |
Обычно используется в объявлениях функций |
| unsigned | Беззнаковый (в сочетании с int/long и т. д.) | unsigned int id = 4000000000u; |
Больший диапазон, но не может представлять отрицательные числа |
2. Время жизни переменной/объекта и хранение (хранение и длительность)
| Ключевое слово | Значение (для начинающих) | Пример / Обычное использование | Современная рекомендация |
|---|---|---|---|
| auto | Пусть компилятор автоматически выводит тип (самое важное применение после C++11) | auto x = 3.14; → double |
Настоятельно рекомендуетсячаще всего используется при написании кода |
| const | Константа, не может быть изменена | const int MAX = 100; |
Безопаснее, чем #define, имеет проверку типов |
| static | Статическое хранилище (общее в пределах файла, общее для членов класса, сохраняет значение внутри функции) | static int count = 0; |
Статические члены класса требуют инициализации вне класса |
| extern | Объявляйте переменные/функции, определённые в другом месте (межфайловое использование) | extern int globalVar; |
Часто используется в многофайловых проектах |
| thread_local | Каждый поток имеет свою собственную копию (C++11) | Многопоточное программирование | |
| регистр | Рекомендуется размещать в регистре (современные компиляторы в основном игнорируют это) | Практически не используется, устарело | |
| mutable | Позволяет константной функции-члену изменять этот член | Особый сценарий внутри класса |
3. Классы и основы объектно-ориентированного программирования (основы ООП)
| Ключевое слово | Значение (для начинающих) | Пример / Описание | Важность |
|---|---|---|---|
| класс | Определить класс (по умолчанию private) | class Student { ... }; |
★★★★★ |
| struct | Определить struct (по умолчанию public, совместим с C) | struct Point { int x,y; }; |
★★★★ |
| public | Открытые члены, доступны всем | ||
| private | Закрытые члены, доступны только этому классу и друзьям | ||
| protected | Защищённые члены, доступные этому классу + производным классам + друзьям | ||
| this | Указатель на текущий объект | this->age = 18; |
Часто используется для различения параметров с одинаковым именем |
| friend | Friend (разрешает доступ к private/protected) | friend class Utils; |
Используется редко; применяйте с осторожностью, так как нарушает инкапсуляцию |
| virtual | Виртуальная функция (реализует полиморфизм) | virtual void draw() = 0; |
Основа полиморфизма |
| override | Явно объявить, что это override (C++11, рекомендуется добавлять) | void draw() override; |
Предотвращает опечатки |
| final | Запретить наследование / запретить переопределение (C++11) | class My final {} |
Ясность проектного замысла |
| explicit | Запретить неявное преобразование (чаще всего с конструкторами с одним аргументом) | explicit MyClass(int x); |
Предотвращает случайные преобразования |
4. Управление памятью и указатели
| Ключевое слово | Значение (для начинающих) | Пример / Описание | Современная рекомендация |
|---|---|---|---|
| новый | Динамически выделять память (возвращает указатель) | int* p = new int(5); |
Старайтесь использовать умные указатели |
| удаление | Освобождайте память, выделенную с помощью new | delete p; delete[] arr; |
Используйте парами, чтобы избежать утечек памяти |
| nullptr | Константа нулевого указателя (C++11, рекомендуемая замена NULL) | int* ptr = nullptr; |
Настоятельно рекомендуется |
5. Приведение типов (4 приведения, по убыванию безопасности)
| Ключевое слово | Значение (для начинающих) | Безопасность | Рекомендуемые случаи использования |
|---|---|---|---|
| static_cast | Преобразование во время компиляции (связанные типы, числовые преобразования и т. д.) | Высокая | Чаще всего используется в повседневной работе |
| const_cast | Добавление/удаление const или volatile | Средняя | Используется редко, опасно |
| dynamic_cast | Безопасное во время выполнения понижающее приведение (полиморфные классы) | Высокая | Проверка типов в иерархиях наследования |
| reinterpret_cast | Низкоуровневая, опасная переинтерпретация битового шаблона (произвольное преобразование между указателями) | Низкая | Используется редко (например, взаимодействие с аппаратным обеспечением) |
6. Управление потоком выполнения (самое базовое)
| Ключевое слово | Значение (для начинающих) | Пример |
|---|---|---|
| if / else | Условное ветвление (выполнить, если условие истинно, иначе выполнить другую часть) | int a = 8; if (a > 10) { cout << "大于10"; } else { cout << "不大于10"; } |
| switch | Многоветвевой выбор (поддерживает только типы integer/enum/char) | int score = 9; switch (score) { case 9: cout << "优秀"; break; default: cout << "普通"; } |
| case / default | Метки ветвления в switch (case соответствует значению, default соответствует всем несовпавшим случаям) | char ch = 'a'; switch (ch) { case 'a': cout << "字母A"; break; default: cout << "其他字符"; } |
| for | Цикл с подсчётом/диапазоном (подходит для сценариев с известным числом итераций) | for (int i=0; i<10; i++) { cout << i; }(цикл с подсчётом)vector<int> v={1,2,3}; for (int num : v) { cout << num; }(цикл по диапазону) |
| while | Сначала проверка, затем выполнение (неизвестное количество итераций; цикл выполняется только пока условие истинно) | int i=1; while (i<=5) { cout << i; i++; } |
| do | Выполнить хотя бы один раз, затем проверить (неизвестное количество итераций; гарантирует первое выполнение) | int i=1; do { cout << i; i++; } while (i<=5); |
| break | Прервать текущий цикл/ветвь switch (немедленно завершается, последующее содержимое не выполняется) | for (int i=0; i<10; i++) { if (i==5) break; cout << i; }(выход из цикла)switch (score) { case 9: break; }(выход из ветви switch) |
| continue | Пропустить оставшуюся часть текущей итерации цикла и перейти непосредственно к следующей итерации | for (int i=0; i<10; i++) { if (i%2==0) continue; cout << i; }(выводить только нечётные числа) |
| return | Вернуть результат функции (для функций с возвращаемым значением) или завершить void-функцию досрочно | int add(int a, int b) { return a + b; }(вернуть результат функции)void print() { if (1) return; cout << "此行不会执行"; }(завершить void-функцию досрочно) |
7. Обработка исключений (по-прежнему распространена в современном C++, но не является первым выбором)
try / catch / throw
8. Шаблоны и современное обобщённое программирование (средний/продвинутый)
template、typename、concept(C++20)、requires(C++20)
9. Другие важные, но реже используемые ключевые слова
- constexpr(C++11): константы/функции времени компиляции
- inlineПредлагает встраивание функций (часто используется в определениях в заголовочных файлах в современном C++)
- enumПеречисление (современная рекомендация: enum class)
- namespace / usingУправление пространствами имён
- sizeofПолучить размер типа/объекта в байтах
- typeidИнформация о типе во время выполнения (используется редко)
- asmВстроенный ассемблер (используется редко)
- gotoПереход (категорически не рекомендуется, нарушает структуру)
- exportЭкспорт шаблонов до C++20 (сейчас практически бесполезен)
Примеры
1. auto (Автоматический вывод типа)
Пусть компилятор выведет тип за вас, делая код более кратким и менее подверженным ошибкам.
Примеры
#include <vector>
#include <string>
int main() {
auto a = 42; // выводится как int
auto b = 3.14; // Выводится как double
auto c = "hello"; // Выводится как const char*
auto d = std::string("world"); // Выводится как std::string
auto vec = std::vector{1, 2, 3}; // Выводится как std::vector<int>
std::cout << a << " " << b << " " << c << " " << d << "\n";
for (auto x : vec) { // auto обычно используется в циклах for по диапазону
std::cout << x << " ";
}
std::cout << "\n";
}
Вывод:
42 3.14 hello world 1 2 3
2. const (Константа)
Защитите переменные от случайного изменения, пишите более безопасный код.
Примеры
int main() {
const int MAX = 100; // Должна быть инициализирована, не может быть изменена
// MAX = 200; // Ошибка! Невозможно изменить
const double PI = 3.14159;
std::cout << "π ≈ " << PI << "\n";
int x = 10;
const int* p = &x; // Содержимое, на которое указывает указатель, нельзя изменить
// *p = 20; // Ошибка!
x = 30; // Но сам x можно изменить
std::cout << *p << "\n";
}
圆周率 ≈ 3.14159 30
3. static (статический)
Заставляют переменные "жить дольше", обычно используются для подсчёта и обмена данными.
Примеры
void counter() {
static int count = 0; // Инициализируется только один раз, не уничтожается при завершении функции
count++;
std::cout << "Вызов " << count << " раз"\n";
}
int main() {
counter(); // 1
counter(); // 2
counter(); // 3
}
Вывод:
第 1 次调用 第 2 次调用 第 3 次调用
4. nullptr (современный нулевой указатель)
Безопаснее и понятнее, чем NULL, избегая путаницы типов.
Примеры
int main() {
int* p1 = NULL; // Старый стиль (не рекомендуется)
int* p2 = nullptr; // Рекомендуемый подход в современном C++
if (p2 == nullptr) {
std::cout << "p2 — нулевой указатель\n";
}
// nullptr можно присваивать только указателям, а не целым числам
// int x = nullptr; // Ошибка!
}
Вывод:
p2 是空指针
5. цикл for по диапазону (for(auto : ) цикл range-for)
Самый простой и безопасный способ итерации по контейнерам.
Примеры
#include <vector>
int main() {
std::vector<int> scores {85, 92, 78, 95};
// Традиционный подход
for (size_t i = 0; i < scores.size(); ++i) {
std::cout << scores[i] << " ";
}
std::cout << "\n";
// Современный подход (рекомендуется)
for (auto score : scores) {
std::cout << score << " ";
}
std::cout << "\n";
// Если нужно изменять элементы, используйте ссылку
for (auto& score : scores) {
score += 5;
}
for (auto score : scores) {
std::cout << score << " ";
}
}
Вывод:
85 92 78 95 85 92 78 95 90 97 83 100
6. explicit (запрет неявного преобразования)
Предотвращает ошибки, вызванные случайными преобразованиями типов; добавление explicit делает код более строгим.
Примеры
class Distance {
private:
double meters;
public:
// explicit Distance(double m) : meters(m) {} // Добавление explicit безопаснее
Distance(double m) : meters(m) {} // Без него происходит неявное преобразование
double get() const { return meters; }
};
void print(double d) {
std::cout << "Distance: " << d << " meters\n";
}
int main() {
Distance d = 500; // Если конструктор не explicit, это разрешено
print(d); // Неявно преобразует Distance → double
// print(print); // Если добавить explicit, эта строка вызовет ошибку
}
Вывод (без explicit):
距离: 500 米
7. override (Явное переопределение виртуальных функций)
Написание override позволяет компилятору проверить, действительно ли вы переопределили виртуальную функцию.
Примеры
class Animal {
public:
virtual void speak() const {
std::cout << "Какой-то звук животного\n";
}
};
class Dog : public Animal {
public:
void speak() const override { // Добавление override — самый безопасный вариант
std::cout << "Гав-гав-гав!\n";
}
};
int main() {
Animal* pet = new Dog();
pet->speak();
delete pet;
}
Вывод:
Woof woof woof!
8. constexpr (Вычисления на этапе компиляции)
Выполняйте вычисления на этапе компиляции, делая программы быстрее и безопаснее.
Примеры
constexpr int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
int main() {
constexpr int f5 = factorial(5); // Вычисляется как 120 во время компиляции
std::cout << "5! = " << f5 << "\n";
int x = 6;
// constexpr int f6 = factorial(x); // Ошибка! x не является константой
std::cout << "6! = " << factorial(x) << "\n"; // Вычисление во время выполнения также работает
}
Вывод:
5! = 120 6! = 720
9. using (пространство имён + псевдоним типа)
using упрощает работу с пространствами имён и создаёт удобочитаемые псевдонимы типов.
Примеры
#include <vector>
// Традиционный typedef
typedef std::vector<int> IntVec;
// Современный using (более гибкий, может быть шаблонным)
using StringVec = std::vector<std::string>;
int main() {
using std::cout; // Импортировать только cout
using std::endl;
IntVec v1 {1, 2, 3};
StringVec v2 {"Яблоко", "Банан"};
cout << v1.size() << " " << v2.size() << endl;
}
Вывод:
3 2
10. enum class (Строго типизированное перечисление)
Безопаснее обычного enum, не будет случайно смешиваться с целыми числами.
Примеры
enum class Color { Red, Green, Blue }; // Строго типизирован, не будет неявно преобразовываться в int
int main() {
Color c = Color::Green;
// if (c == 1) {} // Ошибка! Невозможно напрямую сравнивать с int
if (c == Color::Green) {
std::cout << "зелёный\n";
}
// Необходимо явно преобразовать в int
std::cout << "Базовое значение: " << static_cast<int>(c) << "\n";
}
Вывод:
是绿色 底层值: 1