CCareerLab
Главная/База знаний/Собеседование/30 вопросов Junior C++ с ответами 2026
Собеседование
Новоеjunior

30 вопросов Junior C++ с ответами 2026

Вопросы на собеседовании C++ junior с ответами: память, указатели, ООП, STL, многопоточность. Реальные вопросы для подготовки в 2026 году.

Время чтения12 минут
Обновленоиюнь 2026 г.
Уровеньjunior
Главная мысль
Вопросы на собеседовании C++ junior с ответами: память, указатели, ООП, STL, многопоточность. Реальные вопросы для подготовки в 2026 году.

30 вопросов Junior C++ с ответами 2026

Вопросы на собеседовании C++ junior — одни из самых технически сложных среди всех языков. C++ проверяет управление памятью, указатели, ООП и STL глубже, чем большинство других языков. Ниже — реальные вопросы с ответами достаточной глубины для прохождения технического экрана.

Память и указатели

1. В чём разница между stack и heap?
Stack — автоматическая память, управляемая компилятором: переменные создаются при входе в область видимости и уничтожаются при выходе. Heap — динамическая память, управляемая вручную через `new`/`delete` или умные указатели. Stack быстрее (нет оверхеда аллокации), но ограничен по размеру. Heap медленнее, но позволяет хранить объекты дольше функции.

2. Что такое dangling pointer?
Указатель, который ссылается на уже освобождённую память. Происходит когда объект удалён (`delete`), но указатель не обнулён. Обращение к dangling pointer — undefined behavior. Решение: обнулять указатель после delete или использовать умные указатели.

3. Чем отличаются `unique_ptr`, `shared_ptr`, `weak_ptr`?
`unique_ptr` — единственный владелец объекта, некопируемый, перемещаемый. Нулевой оверхед. `shared_ptr` — разделяемое владение через счётчик ссылок; объект удаляется когда счётчик доходит до нуля. `weak_ptr` — слабая ссылка на `shared_ptr`-объект без увеличения счётчика; позволяет разорвать циклические зависимости.

4. Что такое memory leak и как его обнаружить?
Утечка памяти — выделенная через `new` память, которая никогда не освобождается. В долгоживущих процессах приводит к росту потребления памяти. Инструменты обнаружения: Valgrind (Linux), Address Sanitizer (`-fsanitize=address`), Dr. Memory (Windows). Профилактика — использование умных указателей вместо сырых.

5. Что происходит при переполнении стека (stack overflow)?
При глубокой рекурсии или выделении большого массива на стеке стек заканчивается. Программа завершается с сигналом SIGSEGV. Решение: ограничить глубину рекурсии, перейти на итерацию или выделять большие объекты на heap.

Объектно-ориентированное программирование

6. Что такое виртуальные функции и зачем нужны?
Виртуальные функции обеспечивают полиморфизм: при вызове через указатель или ссылку на базовый класс вызывается реализация производного класса. Механизм работает через vtable — таблицу указателей на функции. Без `virtual` вызов определяется статически (по типу переменной), с `virtual` — динамически (по типу объекта).

7. Зачем нужен виртуальный деструктор?
Без виртуального деструктора в базовом классе при удалении объекта производного класса через указатель на базовый вызывается только деструктор базового класса — деструктор производного не вызывается. Это утечка ресурсов. Правило: если в классе есть хотя бы одна виртуальная функция — деструктор тоже делайте виртуальным.

8. Что такое Rule of Three / Rule of Five?
Rule of Three: если класс определяет деструктор, конструктор копирования или оператор присваивания копией — скорее всего нужно определить все три. Rule of Five (C++11): к трём добавляются конструктор перемещения и оператор присваивания перемещением. Актуально для классов, управляющих ресурсами (память, файлы, соединения).

9. Чем отличается перегрузка от переопределения?
Перегрузка (overloading) — несколько функций с одним именем, но разными сигнатурами в одной области видимости. Определяется на этапе компиляции. Переопределение (overriding) — переопределение виртуальной функции базового класса в производном с той же сигнатурой. Определяется в runtime через vtable.

10. Что такое чисто виртуальная функция и абстрактный класс?
Чисто виртуальная функция объявляется с `= 0`: `virtual void draw() = 0;`. Класс с хотя бы одной чисто виртуальной функцией — абстрактный: нельзя создать экземпляр. Производные классы обязаны переопределить все чисто виртуальные функции, иначе тоже станут абстрактными.

Ссылки и move-семантика

11. В чём разница между lvalue и rvalue?
lvalue — именованный объект, у которого можно взять адрес: переменная, элемент массива. rvalue — временный объект без имени: результат выражения, литерал. С C++11 введены rvalue-ссылки (`&&`) и move-семантика для эффективной передачи временных объектов без копирования.

12. Что делает `std::move`?
`std::move` — это cast: он превращает lvalue в rvalue-ссылку, позволяя вызвать конструктор перемещения вместо конструктора копирования. Сам по себе не перемещает ничего — только меняет категорию значения. После `std::move(obj)` объект `obj` находится в «перемещённом» состоянии: допустимом, но неопределённом.

13. Что такое perfect forwarding?
Техника передачи аргументов в шаблонных функциях без потери категории значения. Реализуется через `std::forward<T>` в сочетании с universal reference (`T&&`). Позволяет шаблону принять lvalue и передать как lvalue, принять rvalue — передать как rvalue.

STL и шаблоны

14. Какие контейнеры STL вы знаете и когда применять?
`vector` — динамический массив, O(1) доступ по индексу, O(n) вставка в середину. `list` — двусвязный список, O(1) вставка/удаление при наличии итератора, нет произвольного доступа. `map` — упорядоченное дерево (красно-чёрное), O(log n) операции. `unordered_map` — хеш-таблица, O(1) в среднем. `set`/`unordered_set` — аналогично map без значений. `deque` — двусторонняя очередь, O(1) вставка/удаление с обоих концов.

15. Чем отличается `vector::push_back` от `emplace_back`?
`push_back` принимает уже сконструированный объект и копирует или перемещает его в контейнер. `emplace_back` принимает аргументы конструктора и создаёт объект непосредственно в памяти контейнера (in-place construction) — без промежуточного копирования. Для сложных объектов `emplace_back` эффективнее.

16. Что такое итераторы и какие виды бывают?
Итератор — обобщённый указатель для обхода контейнеров. Виды по мощности: input iterator (только чтение, один проход), output iterator (только запись), forward iterator (несколько проходов вперёд), bidirectional iterator (вперёд и назад, `list`), random access iterator (произвольный доступ, `vector`, `deque`).

17. Что такое шаблон функции?
Шаблон функции позволяет писать обобщённый код, работающий с разными типами. Компилятор генерирует конкретные реализации при инстанциировании. Пример: `template<typename T> T max(T a, T b) { return a > b ? a : b; }`. Работает для любого типа, у которого определён `operator>`.

Многопоточность

18. Что такое гонка данных (data race)?
Ситуация когда два потока одновременно обращаются к одной переменной и хотя бы одно обращение — запись, без синхронизации. Результат — undefined behavior. Решения: `std::mutex`, `std::atomic`, lock-free структуры.

19. Чем отличается `mutex` от `atomic`?
`mutex` блокирует поток при захвате и разблокирует при освобождении — тяжёлая синхронизация, подходит для сложных операций. `atomic` — легковесная атомарная операция на уровне CPU (load, store, compare-exchange) без блокировки потока. Для простых счётчиков и флагов `atomic` быстрее.

20. Что такое deadlock и как избежать?
Deadlock — два или более потока бесконечно ждут ресурсы друг друга. Пример: поток A держит mutex1 и ждёт mutex2, поток B держит mutex2 и ждёт mutex1. Профилактика: захватывать мьютексы в одном порядке, использовать `std::lock()` для одновременного захвата нескольких мьютексов, таймауты.

Разное

21. Что такое RAII?
Resource Acquisition Is Initialization — идиома: ресурс захватывается в конструкторе и освобождается в деструкторе. Деструктор вызывается автоматически при выходе из области видимости — в том числе при исключениях. Пример: `std::lock_guard`, `std::unique_ptr`. RAII — основа безопасного управления ресурсами в C++.

22. В чём разница между `struct` и `class`?
Единственная разница: по умолчанию члены `struct` публичны (`public`), члены `class` — приватны (`private`). Идиоматически: `struct` для простых агрегатов данных, `class` для объектов с инвариантами и поведением.

23. Что такое `const` correctness?
Соглашение помечать всё, что не должно изменяться, как `const`. Константные методы (`void foo() const`) не изменяют состояние объекта. Константные ссылки (`const T&`) избегают копирования и запрещают модификацию. Помогает компилятору оптимизировать и предотвращает ошибки.

24. Что такое `inline` функция?
Подсказка компилятору подставить тело функции в место вызова вместо вызова через стек. Уменьшает оверхед вызова для маленьких функций. В C++ `inline` в заголовочных файлах ещё решает проблему множественных определений.

25. Чем `nullptr` лучше `NULL`?
`NULL` — макрос, обычно `0` (целое число). `nullptr` — типизированный нулевой указатель типа `std::nullptr_t`. При перегруженных функциях `f(int)` и `f(int)` вызов `f(NULL)` вызовет `f(int)`, а `f(nullptr)` — `f(int)`. `nullptr` безопаснее и однозначнее.

26. Что такое исключения в C++?
Механизм обработки ошибок через `try/catch/throw`. Исключение бросается через `throw`, перехватывается в `catch`. При броске исключения стек раскручивается: вызываются деструкторы всех объектов на стеке (RAII гарантирует освобождение ресурсов). `noexcept` — маркер что функция не бросает исключений.

27. Что такое `constexpr`?
Переменная или функция, вычисляемая на этапе компиляции. Позволяет использовать результат в константных выражениях (размеры массивов, шаблонные параметры). Функция `constexpr` может вызываться как в compile-time, так и в runtime контексте.

28. Что такое лямбда-выражение?
Анонимная функция, создаваемая на месте. Синтаксис: `capture { body }`. `[&]` — захват всего по ссылке, `[=]` — по значению. Лямбды используются с алгоритмами STL (`std::sort`, `std::for_each`), в callback'ах и функциональном программировании.

29. Разница между компиляцией и компоновкой (linking)?
Компиляция — каждый `.cpp` файл независимо преобразуется в объектный файл `.o`. Компоновка — объектные файлы и библиотеки объединяются в исполняемый файл. Ошибки компиляции: синтаксис, типы. Ошибки компоновки: неразрешённые символы (`undefined reference`) — функция объявлена, но не определена.

30. Что такое неопределённое поведение (undefined behavior)?
Ситуации, результат которых не определён стандартом C++: integer overflow для знаковых целых, разыменование нулевого/dangling указателя, data race, выход за границы массива. Компилятор может генерировать любой код, что приводит к непредсказуемым результатам. Инструменты обнаружения: UBSan (`-fsanitize=undefined`), ASan.

FAQ

Насколько сложен C++ junior по сравнению с другими языками?
C++ — один из самых требовательных языков для входа. Управление памятью, указатели, undefined behavior — темы, которых нет в Python или Java. Зарплаты выше, вакансий junior-уровня меньше. Подробнее: вопросы C++ junior.

Что проверяют на практическом задании?
Написать класс с правильным управлением памятью, реализовать алгоритм на STL или исправить код с утечкой памяти или data race.

Как готовиться к алгоритмам на C++?
LeetCode с фильтром по C++. Освойте работу с `vector`, `map`, `set`, очередями и стеком через STL — это быстрее, чем писать структуры с нуля.