Программа курса← Программирование на языке C++
1Введение в язык C++
2Как выполняются программы на C++
3Структуры и классы
4Объектно-ориентированное программирование
5Дополнительные возможности C++
6Шаблоны
7Методические материалы

Словарик терминов

Короткие определения всего, что встречается в курсе, – чтобы не перечитывать урок целиком ради одного слова. Формулировки намеренно сжатые: за подробностями и примерами – в соответствующий урок.

Сборка программы

  • Препроцессор (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) – записанные требования к параметрам шаблона; переносят ошибку из глубины инстанцирования на границу.