Шпаргалка по C++
Последнее обновление
Hello World и структура программы
Выполнение начинается с main, который возвращает int.
| Элемент | Код |
|---|---|
| Подключить заголовок | #include <iostream> |
| Точка входа | int main() { ... } |
| Вывести строку | std::cout << "Hello, World!" << std::endl; |
| Считать ввод | std::cin >> x; |
| Использовать пространство имён std | using namespace std; |
| Вернуть признак успеха | return 0; |
| Комментарии | // line и /* block */ |
Типы данных
| Тип | Описание |
|---|---|
int | Целое (обычно 32 бита) |
long / long long | Более широкие целые |
float / double | Числа с плавающей точкой |
char | Один байт / символ |
bool | true или false |
std::string | Динамический текст из <string> |
auto | Компилятор выводит тип |
std::size_t | Беззнаковый тип для размеров и индексов |
Переменные и ссылки
Ссылки - это псевдонимы; указатели хранят адреса.
| Операция | Синтаксис |
|---|---|
| Объявить и инициализировать | int x = 5; |
| Инициализация фигурными скобками | int x{5}; |
| Константа | const double PI = 3.14159; |
| Константа времени компиляции | constexpr int N = 10; |
| Ссылка (псевдоним) | int &r = x; |
| Указатель | int *p = &x; |
| Разыменовать указатель | *p = 10; |
| Вывод типа | auto y = 3.14; |
Управление потоком
| Конструкция | Синтаксис |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| Switch | switch (n) { case 1: ...; break; default: ...; } |
| Цикл while | while (i < n) { ... } |
| Цикл do-while | do { ... } while (i < n); |
| Цикл for | for (int i = 0; i < n; i++) { ... } |
| For по диапазону | for (auto x : vec) { ... } |
| For по диапазону по ссылке | for (auto &x : vec) { ... } |
| Break / continue | break; выходит из цикла, continue; переходит к следующей итерации |
Функции
| Операция | Синтаксис |
|---|---|
| Определить функцию | int add(int a, int b) { return a + b; } |
| Без возвращаемого значения | void greet() { ... } |
| Аргументы по умолчанию | int pow(int b, int e = 2) { ... } |
| Передача по ссылке | void inc(int &x) { x++; } |
| Константная ссылка (без копии) | void print(const std::string &s) { ... } |
| Перегрузка | int max(int a, int b); и double max(double a, double b); |
| Лямбда | auto f = [](int x) { return x * 2; }; |
| Лямбда с захватом | auto g = [n](int x) { return x + n; }; |
Классы и ООП
| Операция | Синтаксис |
|---|---|
| Определить класс | class Dog { ... }; |
| Спецификаторы доступа | public:, private:, protected: |
| Поле-член | std::string name; |
| Конструктор | Dog(std::string n) : name(n) {} |
| Деструктор | ~Dog() { ... } |
| Функция-член | void bark() { ... } |
| Создать объект | Dog d("Rex"); |
| Наследование | class Puppy : public Dog { ... }; |
| Виртуальная функция | virtual void speak(); |
Контейнеры STL
Распространённые контейнеры из стандартной библиотеки.
| Контейнер | Применение и пример |
|---|---|
std::vector<int> | Динамический массив: v.push_back(1); v.size(); |
std::string | Текст: s += "!"; s.length(); |
std::array<int, 3> | Массив фиксированного размера со сведениями о границах |
std::map<K, V> | Отсортированный ключ-значение: m["a"] = 1; |
std::unordered_map<K, V> | Хеш-таблица (быстрый поиск, без порядка) |
std::set<T> | Отсортированные уникальные значения: s.insert(5); |
std::pair<A, B> | Два значения: make_pair(1, "x") |
std::queue / std::stack | Адаптеры очереди FIFO / стека LIFO |
Алгоритмы и итераторы STL
Из <algorithm>; большинство принимает диапазон итераторов begin/end.
| Операция | Синтаксис |
|---|---|
| Итераторы begin / end | v.begin(), v.end() |
| Сортировка | std::sort(v.begin(), v.end()); |
| Сортировка по убыванию | std::sort(v.begin(), v.end(), std::greater<int>()); |
| Найти значение | auto it = std::find(v.begin(), v.end(), 5); |
| Посчитать совпадения | std::count(v.begin(), v.end(), 5); |
| Минимальный / максимальный элемент | std::max_element(v.begin(), v.end()); |
| Сумма по диапазону | std::accumulate(v.begin(), v.end(), 0); |
| Преобразовать каждый элемент | std::transform(v.begin(), v.end(), v.begin(), fn); |
Умные указатели и современный C++
Предпочитайте умные указатели сырым new/delete для автоматической очистки.
| Возможность | Синтаксис |
|---|---|
| Единоличное владение | auto p = std::make_unique<Dog>("Rex"); |
| Совместное владение | auto p = std::make_shared<Dog>("Rex"); |
| Невладеющая ссылка | std::weak_ptr<Dog> w = p; |
| Семантика перемещения | auto v2 = std::move(v1); |
| Nullptr | int *p = nullptr; |
| Структурные привязки | auto [key, val] = *it; |
| Опциональное значение | std::optional<int> maybe; |
| Шаблоны | template <typename T> T add(T a, T b) { return a + b; } |
Синтаксис C++, контейнеры STL и современные возможности, которые нужны чаще всего, на одной странице. Эта шпаргалка по C++ - быстрый справочник для написания кода на C++: типы данных, ссылки, классы, контейнеры и алгоритмы стандартной библиотеки, а также умные указатели, заменяющие сырые new/delete.
Всё здесь - стандартный C++ (C++11 и новее), который компилируется с помощью g++ или clang++. Копируйте нужное или попробуйте любой фрагмент вживую в playground для C++ - без установки компилятора.
Часто задаваемые вопросы по шпаргалке C++
Эта шпаргалка по C++ бесплатна?
В чём разница между указателем и ссылкой в C++?
*p. Ссылка (int &r = x) - это псевдоним существующей переменной: она должна быть связана при объявлении, никогда не может быть нулевой или перепривязанной и используется как сама переменная. Используйте ссылки для более чистой передачи параметров по ссылке, а указатели - когда нужна необязательная или переназначаемая косвенность.Что использовать - new/delete или умные указатели?
std::unique_ptr и std::shared_ptr (через make_unique/make_shared) автоматически освобождают свою память при выходе из области видимости, что предотвращает утечки и двойные освобождения, свойственные ручным new/delete. Используйте сырые new/delete только в низкоуровневом коде, где для этого есть конкретная причина.