Короткие определения всего, что встречается в курсе, – чтобы не перечитывать урок целиком ради одного слова. Формулировки намеренно сжатые: за подробностями и примерами – в соответствующий урок.
Сборка программы
- Препроцессор (preprocessor) – первый этап сборки: подставляет заголовки, разворачивает
макросы, вырезает ветки
#ifdef. Работает с текстом и о языке ничего не знает. - Единица трансляции (translation unit) – один
.cppпосле работы препроцессора, со всем подставленным содержимым заголовков. Именно её обрабатывает компилятор. - Объектный файл (object file) – машинный код одной единицы трансляции плюс таблица имён: что файл предоставляет и чего ему не хватает.
- Компоновщик (linker) – собирает объектные файлы и библиотеки в исполняемый файл, сопоставляя использования имён с их определениями.
- Объявление и определение – объявление говорит «такое имя есть и вот его тип», определение задаёт содержимое. Объявлений может быть много, определение одно.
- ODR (One Definition Rule) – правило одного определения: у каждой сущности в программе
ровно одно определение. Исключения –
inline-функции, шаблоны и классы. - Include guard – пара
#ifndef/#defineили#pragma onceв начале заголовка, защищающая от повторной подстановки в одну единицу трансляции. - Макрос (macro) – текстовая замена, выполняемая препроцессором. Не знает про типы и
области видимости, поэтому в современном коде вытеснен
constexprи шаблонами. - Искажение имён (name mangling) – кодирование типов параметров в имени символа, чтобы перегрузки не совпали в объектном файле.
Память
- Стек (stack) – область памяти для локальных переменных и кадров вызовов. Выделение – сдвиг указателя, освобождение автоматическое, размер ограничен.
- Куча (heap) – память, выдаваемая аллокатором по запросу
new. Время жизни задаёте вы. - Кадр вызова (stack frame) – блок на стеке под один вызов: аргументы, локальные переменные, адрес возврата.
- Переполнение стека (stack overflow) – кадры заполнили отведённую стеку область. Обычно из-за бесконечной рекурсии.
- Указатель (pointer) – переменная, хранящая адрес. Тип указателя задаёт шаг арифметики и размер читаемого при разыменовании.
- Ссылка (reference) – псевдоним существующего объекта. Привязывается при создании, переприсвоить нельзя, пустой не бывает.
- Разыменование (dereference) – обращение к объекту по адресу:
*p. - Арифметика указателей – сложение и вычитание в элементах, а не в байтах:
p + nсдвигает наn * sizeof(*p). - Распад массива (array decay) – автоматическое превращение имени массива в указатель на первый элемент; при этом теряется размер.
- C-style строка – массив
char, заканчивающийся символом'\0'. Длина нигде не хранится. - Висячий указатель (dangling pointer) – указатель на освобождённую память или на умерший объект.
- Утечка памяти (memory leak) – потерян последний указатель на выделенный блок, и освободить его больше некому.
- Двойное освобождение (double free) –
deleteпо одному адресу дважды; портит структуры аллокатора. - Неопределённое поведение (undefined behaviour, UB) – ситуация, поведение в которой стандарт не описывает. Компилятор вправе делать что угодно, включая «работает до поры».
Типы и функции
- Тип (type) – описание того, как интерпретировать байты и какие операции над ними
допустимы.
constи&– часть типа. - auto – вывод типа переменной из инициализатора на этапе компиляции.
- constexpr – разрешение вычислить функцию или переменную на этапе компиляции, если аргументы известны.
- Перегрузка (overload) – несколько функций с одним именем и разными параметрами. Выбор делает компилятор.
- Разрешение перегрузки (overload resolution) – процедура выбора: точное совпадение, продвижение типа, стандартное преобразование, пользовательское.
- Сокрытие имён (name hiding) – имя во внутренней области видимости скрывает все одноимённые из внешней, включая другие перегрузки.
- Передача по значению / по ссылке / по константной ссылке – копия, псевдоним с правом изменения, псевдоним без него.
Классы
- struct и class – одно и то же, кроме доступа по умолчанию:
publicу первого,privateу второго. - Поле (field, data member) – переменная внутри объекта.
- Метод (method, member function) – функция класса; получает скрытый параметр
this. - this – указатель на объект, у которого вызван метод.
- Конструктор (constructor) – приводит новый объект в пригодное к работе состояние.
- Список инициализации (member initializer list) – часть конструктора после двоеточия; единственный способ именно инициализировать поля, а не присвоить им.
- Деструктор (destructor) – отрабатывает при уничтожении объекта; в C++ момент вызова детерминирован.
- explicit – запрет неявного преобразования через конструктор или оператор приведения.
- Модификаторы доступа –
public,protected,private: кому видны члены класса. - Инвариант (invariant) – утверждение, верное для объекта всегда; ради него и закрывают поля.
- Инкапсуляция (encapsulation) – данные и работающий с ними код собраны вместе, наружу торчит только контракт.
- RAII (Resource Acquisition Is Initialization) – ресурс захватывается в конструкторе и освобождается в деструкторе.
- Константный метод – метод, помеченный
const; обещает не менять объект и только он доступен у константного объекта. - Const-корректность – код, в котором все не изменяющие методы и параметры помечены
const. - mutable – разрешение менять поле внутри константного метода; для кэшей и мьютексов.
- Поверхностная и глубокая копия – копирование указателя против копирования данных, на которые он смотрит.
- Правило трёх – понадобился деструктор, значит нужны и конструктор копирования, и оператор присваивания. С C++11 – правило пяти, а лучше правило нуля.
- Copy elision – право компилятора не создавать копию при возврате из функции; с C++17 в ряде случаев обязанность.
- Copy and swap – идиома оператора присваивания: принять параметр по значению и обменяться с ним внутренностями.
- Статический член – поле или метод, принадлежащие классу, а не объекту.
- friend – выданное классом разрешение конкретной функции или классу видеть его закрытые члены. Не взаимна, не наследуется, не транзитивна.
Наследование и полиморфизм
- Наследование (inheritance) – класс получает данные и поведение другого класса. Публичное выражает отношение «is-a».
- Базовый и производный класс (base / derived) – от кого наследуют и кто наследует.
- Композиция (composition) – объект содержит другой объект полем. Обычно предпочтительнее наследования, если не нужна подстановка.
- Виртуальный метод (virtual) – реализация выбирается во время выполнения по фактическому типу объекта.
- override – указание компилятору проверить, что метод действительно переопределяет виртуальный метод базы.
- final – запрет наследования от класса или дальнейшего переопределения метода.
- Чисто виртуальный метод – объявлен с
= 0, реализации в базе нет. Делает класс абстрактным. - Абстрактный класс – класс хотя бы с одним чисто виртуальным методом; экземпляр создать нельзя.
- Интерфейс – абстрактный класс без полей, все методы чисто виртуальные. Отдельного ключевого слова в C++ нет.
- Таблица виртуальных методов (vtable) – массив адресов реализаций, один на класс; в объекте лежит указатель на неё (vptr).
- Виртуальный деструктор – обязателен у класса, объекты которого удаляют через указатель на базу.
- Срезка объекта (object slicing) – копирование наследника в переменную базового типа: производная часть теряется молча.
- Ромбовидное наследование – две ветви наследуют общую базу, третий класс – обе ветви.
Без
virtualбазовая часть дублируется. - Виртуальное наследование – ветви разделяют один экземпляр общей базы.
- dynamic_cast – проверка фактического типа во время выполнения; возвращает
nullptrпри несовпадении. Требует полиморфного класса. - Статический и динамический полиморфизм – выбор на компиляции (перегрузка, шаблоны) против выбора во время работы (виртуальные методы).
- Идиома Clone – виртуальный метод, возвращающий копию объекта: замена невозможному виртуальному конструктору.
Операторы и умные указатели
- Перегрузка операторов – определение оператора для пользовательского типа. Приоритет, ассоциативность и арность изменить нельзя.
- Функтор (function object) – объект с перегруженным
operator(); вызывается как функция, может хранить состояние. - Лямбда-выражение – безымянный функтор, порождаемый компилятором; в квадратных скобках перечисляется захват.
- Умный указатель (smart pointer) – объект, владеющий указателем и освобождающий его в деструкторе.
- unique_ptr – единоличное владение, копирование запрещено, накладных расходов нет.
- shared_ptr – разделяемое владение через счётчик ссылок.
- weak_ptr – наблюдающая ссылка, не удерживающая объект; лекарство от циклов.
- std::move – не перемещает данные, а разрешает забрать внутренности объекта.
- Singleton – ровно один экземпляр и глобальная точка доступа. В C++ реализуется локальной статической переменной; чаще вреден, чем полезен.
Шаблоны
- Шаблон (template) – рецепт для генерации классов или функций по параметрам-типам и параметрам-значениям.
- Инстанцирование (instantiation) – порождение компилятором настоящего класса или функции по шаблону и конкретным аргументам.
- Вывод аргументов (argument deduction) – определение параметров шаблона функции по типам фактических аргументов. Неявных преобразований не делает.
- Полная специализация – отдельная реализация шаблона для конкретного набора аргументов.
- Частичная специализация – отдельная реализация для формы аргументов (
T*,std::pair<K, V>). Только для классов. - Трейт (type trait) – шаблон, сообщающий свойство типа на этапе компиляции; собраны в
<type_traits>. - Стирание типа (type erasure) – конкретный тип прячется за нешаблонным интерфейсом и
восстанавливается при обращении. Так устроены
std::anyиstd::function. - Placement new – создание объекта по заранее выделенному адресу; парный ему явный вызов деструктора нужен только внутри контейнеров.
- Концепты (concepts, C++20) – записанные требования к параметрам шаблона; переносят ошибку из глубины инстанцирования на границу.