Документация по C++
Краткий справочник по C++ с примерами. Прочитай концепцию, посмотри код, а затем потренируйся в курсе Coddy.
Начать пошаговый курс по C++Начало работы
- Что такое C++Что такое C++ на самом деле, почему он компилируется прямо в нативный машинный код и какое высокопроизводительное ПО на нём пишут.
- Установка C++Как установить компилятор C++ (GCC, Clang или MSVC), выбрать набор инструментов для своей операционной системы и убедиться, что он работает из командной строки.
- Компиляция C++Как C++ превращает исходник .cpp в нативный исполняемый файл: компиляция с g++ (или clang++/MSVC), запуск бинарника и чтение ошибок компилятора, когда что-то идёт не так.
- Синтаксис C++Основные правила синтаксиса программы на C++ - операторы и точки с запятой, блоки в фигурных скобках, функция main и как работает вывод - объясняются на примере первой программы.
- КомментарииКак писать комментарии в C++ - однострочные заметки // и многострочные блоки /* */ - а также как закомментировать код, почему блочные комментарии не вкладываются друг в друга и что делает комментарий полезным.
Переменные и типы
- ПеременныеКак работают переменные в C++ - объявление с указанием типа, разница между присваиванием и инициализацией, инициализация фигурными скобками, правила именования и область видимости, которая определяет, где переменная живёт и умирает.
- Типы данныхПрактический обзор фундаментальных типов данных C++ - целых чисел, чисел с плавающей точкой, char и bool - а также размеров, signed и unsigned, литералов и суффиксов, переполнения и того, как выбрать правильный тип.
- Ключевое слово autoКак ключевое слово `auto` позволяет компилятору выводить тип переменной за вас — что оно отбрасывает, где оно блистает и какие ловушки подстерегают новичков.
- Константы и constКак объявлять значения только для чтения в C++ с помощью const, разница между const и constexpr, константные указатели и указатели на константу, а также константные методы.
- ОператорыИзучите операторы C++ - арифметические, сравнения, логические, присваивания и побитовые - а также подводные камни целочисленного деления, приоритета и короткого замыкания.
- Приведение типовКак работает приведение типов в C++: неявные преобразования, ловушка целочисленного деления и четыре именованных каста (static_cast, const_cast, reinterpret_cast, dynamic_cast) — с подводными камнями, которые приводят к тихой потере данных.
Поток управления
- if-elseКак принимать решения в C++ с помощью if, else if и else: условия, цепочки ветвей, вложенность, тернарный оператор, if с инициализатором и подводные камни, на которых спотыкаются.
- switchОператор switch в C++ простыми словами: метки case, break и проваливание (fall-through), ветка default, группировка случаев, switch по enum и подводные камни при объявлениях внутри case.
- цикл forКак повторять код с помощью цикла for в C++: заголовок из трёх частей, счёт вверх и вниз, перебор массивов, вложенность, break и continue, а также ошибки смещения на единицу и беззнаковых типов, на которых попадаются все.
- Циклы whileЦикл while в C++: while с проверкой условия в начале, do-while с выполнением хотя бы один раз, цикл до сигнального значения, break и continue, а также как избежать бесконечных циклов.
- for по диапазонуЦикл for на основе диапазона в C++ простыми словами: чистый обход массивов, векторов, строк и map, почему стоит использовать auto& и const auto&, а также как избежать ловушек с копированием и инвалидацией итераторов.
Функции
- ФункцииКак писать функции в C++ — анатомия из типа возвращаемого значения/имени/параметров, объявления против определений, возврат значений, void-функции и подводные камни вроде пропущенного return или забытого прототипа.
- Параметры функцийКак аргументы попадают в функции C++ - передача по значению и по ссылке, const-ссылки для дешёвого доступа только для чтения, аргументы по умолчанию, указатели и подводные камни стоимости копирования, которые незаметно замедляют программы.
- СсылкиСсылки в C++ простыми словами: как & в параметре создаёт псевдоним, почему передача по ссылке избегает копий и позволяет функции изменять переменные вызывающего кода, и когда выбирать const& и ссылки вместо возврата по значению.
- Перегрузка функцийПерегрузка функций в C++ позволяет нескольким функциям иметь одно имя, пока их списки параметров различаются. Узнайте, как разрешение перегрузки выбирает подходящий вариант, почему один лишь тип возвращаемого значения не считается и каких ловушек неоднозначности и аргументов по умолчанию следует избегать.
- ЛямбдыПишите небольшие встроенные функции на лету с помощью лямбд C++ - синтаксис, как работают захваты, когда нужен `mutable` и ловушка висячего захвата, в которую попадают все.
Указатели и память
- УказателиУказатели в C++ с нуля: как объявить указатель, операторы & (взятие адреса) и * (разыменование), nullptr, указатели на массивы и ловушки висячих и неинициализированных указателей, приводящие к падениям.
- Ссылки и указателиПрактическое сравнение ссылок и указателей в C++: что у них общего, чем они различаются (перепривязка, null, арифметика) и понятное правило, к чему прибегать в повседневном коде.
- Динамическая памятьКак выделять память во время выполнения с помощью `new`, освобождать её через `delete` и избегать утечек, висячих указателей и двойного освобождения, которые приходят вместе с ручным управлением кучей.
- Умные указателиУмные указатели владеют памятью в куче и освобождают её автоматически. Изучи `unique_ptr`, `shared_ptr`, `make_unique` и `make_shared` — и почему тебе почти никогда больше не придётся писать `new`/`delete`.
Строки и ввод-вывод
- СтрокиКак использовать `std::string` в C++ - безопасно собирать, объединять, искать и нарезать текст, а также почему для реальной работы почти никогда не нужен сырой `char*`.
- Ввод и выводКак работает консольный ввод-вывод в C++: вывод через cout, чтение через cin, классический баг с переводом строки в getline после cin и как восстановиться, когда ввод не удался.
- Строковые потокиКак использовать std::stringstream, istringstream и ostringstream для разбора текста, разбиения строк по пробелам, преобразования между строками и числами и сборки форматированных строк в памяти.
Контейнеры STL
- МассивыСырые массивы C++ простыми словами: как их объявлять и инициализировать, безопасно индексировать, проходить по ним с учётом размера, ловушка распада массива в указатель и почему std::array и vector обычно лучше.
- vectorstd::vector - это массив C++ с изменяемым размером, контейнер, к которому стоит обращаться по умолчанию. Узнай, как создавать vector, обращаться к его элементам, наращивать и обходить его, а также об опасностях инвалидации итераторов и выхода за границы.
- mapstd::map в C++ простыми словами — отсортированный по ключу контейнер пар ключ-значение с логарифмическим поиском. Вставка, поиск, обход и как не попасться на классическую ловушку operator[], молча вставляющую ключи.
- unordered_mapИзучите std::unordered_map в C++ — основанного на хеш-таблице собрата map, который даёт вставку и поиск в среднем за O(1). Рассматриваются базовые операции, ловушка с автоматической вставкой через [], count против find и когда выбирать его вместо упорядоченного map.
- setКак std::set хранит уникальные и автоматически отсортированные значения в C++: вставка, проверка наличия с помощью count и find, обход по порядку и различия между set, multiset и unordered_set.
- pair и tupleКак `std::pair` и `std::tuple` объединяют два и более значений в один объект: как их создавать, обращаться к полям, structured bindings и где какой из них уместен.
- ИтераторыКак итераторы C++ работают в роли обобщённых указателей внутрь контейнеров: begin() и end(), разыменование, продвижение, варианты const/reverse, а также ловушки с инвалидацией и разыменованием end(), приводящие к неопределённому поведению.
Алгоритмы STL и шаблоны
- АлгоритмыИспользуйте стандартные алгоритмы C++ - `find`, `count_if`, `transform`, `accumulate`, `remove` - чтобы делать реальную работу над диапазонами без написания циклов вручную, а также разберитесь с подводными камнями пары итераторов и идиомы erase-remove.
- СортировкаСортируйте векторы и массивы в C++ с помощью `std::sort`: порядок по умолчанию, пользовательские компараторы, сортировка структур по полю и ловушка строгого слабого порядка, приводящая к сбоям.
- ШаблоныНапишите код один раз и заставьте его работать для любого типа с помощью шаблонов C++ — шаблоны функций, шаблоны классов, вывод типов и те запутанные ошибки компилятора, которые они порождают.
Классы и объекты
- КлассыУзнайте, как классы C++ объединяют данные и поведение в переиспользуемые типы: объявление переменных-членов и методов, создание объектов, разделение public/private и подводные камни вроде неинициализированных членов и указателя this.
- КонструкторыКонструктор — это специальная функция-член, которая выполняется при создании объекта. Изучите конструкторы по умолчанию, параметризованные и копирующие конструкторы, списки инициализации членов и то, как не оставлять объекты наполовину инициализированными.
- ДеструкторыДеструктор выполняется автоматически при уничтожении объекта. Узнайте синтаксис `~ИмяКласса()`, когда он срабатывает, почему освобождает ресурсы, и правило трёх/пяти.
- НаследованиеУзнайте, как наследование в C++ позволяет производному классу повторно использовать и расширять базовый класс: синтаксис, public- и private-наследование, порядок вызова конструкторов и деструкторов, а также ловушки вроде срезки объектов (slicing).
- Виртуальные функцииВиртуальные функции позволяют указателю на базовый класс во время выполнения вызвать версию метода производного класса. Изучите `virtual`, `override`, абстрактные классы и почему деструктор базового класса должен быть виртуальным.
- Перегрузка операторовПерегрузка операторов в C++ позволяет вашим собственным типам работать со встроенными операторами вроде +, == и <<. Узнайте правила выбора между функцией-членом и свободной функцией, как перегружать операторы сравнения и потока и какие подводные камни связаны с типами возврата и оператором присваивания.
- Спецификаторы доступаКак public, private и protected определяют, кто может трогать члены класса в C++, — основа инкапсуляции, с геттерами, сеттерами и лазейкой friend.
- СтруктурыСтруктуры (struct) в C++ простыми словами: как собрать связанные переменные в один тип, объявить и инициализировать объекты структуры, добавить структуре методы и конструкторы, и чем struct на самом деле отличается от class.
- перечисленияИзучите перечисления в C++: как их объявлять, почему областной enum class безопаснее обычного enum, пользовательские базовые значения, switch по перечислителям и преобразование в целые числа и обратно.
Ошибки и отладка
- ИсключенияИсключения сообщают об ошибках, которые функция не может обработать на месте. Узнайте, как использовать `throw`, какие бывают стандартные типы исключений, что такое сообщение `what()` и почему исключения лучше кодов возврата для действительно важных сбоев.
- try-catchОберните рискованный код в `try`, реагируйте в `catch`. Научитесь перехватывать исключения по константной ссылке, упорядочивать несколько обработчиков, использовать `catch (...)` и пробрасывать исключения дальше - без утечки ресурсов.
- Неопределённое поведениеНеопределённое поведение (UB) — это код, на который стандарт C++ не накладывает никаких правил: он может упасть, испортить данные или казаться работающим. Узнайте о частых причинах, почему «всё запустилось нормально» ничего не доказывает, и об инструментах, которые ловят UB.