Вопросы по C++ на собеседовании и ответы на них
Автор: Aaron Cao · Обновлено

Собеседования по C++ сосредоточены на времени жизни и владении: RAII, правиле пяти, семантике перемещения и выборе подходящего умного указателя. Ожидайте ловушек с неопределённым поведением, вопроса о виртуальном деструкторе и практического этапа, где нужно устранить утечку или висячую ссылку, вслух объясняя ход рассуждений.
Что на самом деле проверяют на собеседованиях по C++?
Собеседования по C++ славятся вопросами на знание мелочей, поэтому кандидаты готовятся, заучивая особенности языка, которыми никогда не будут пользоваться. В основном этот страх напрасен, и в этом разделе объясняется, что действительно оценивают на этапах отбора. Прежде всего интервьюеры хотят понять, умеете ли вы без подсказок рассуждать о времени жизни объектов.
Всё остальное вырастает из этой основы. Умные указатели — это вопрос времени жизни. Семантика перемещения — тоже вопрос времени жизни. Виртуальные деструкторы, инвалидация итераторов и висячие ссылки — те же вопросы времени жизни, только в другом обличье. Кандидат, который во время написания кода объясняет владение, производит впечатление опытного специалиста, даже если путается в синтаксисе; кандидат, который пишет правильный код, но не может сказать, кто чем владеет, выглядит начинающим, даже если код компилируется.
Второй критерий — то, на каком C++ вы пишете. Команды с современными инструментами ожидают, что auto, циклы по диапазону, std::optional и структурированные привязки используются автоматически. Команды в сфере встраиваемых систем и игр часто работают со старыми стандартами либо полностью запрещают исключения и динамическое выделение памяти, поэтому спросят, как вы действуете в таких ограничениях. В начале разговора уточните, на какой стандарт ориентируется команда: от этого зависит, каким будет хороший ответ.
Какие вопросы встречаются почти на каждом собеседовании?
Этот основной набор повторяется в разных компаниях, и за каждым вопросом скрывается дополнительный.
- Что такое RAII? Ресурс приобретается в конструкторе и освобождается в деструкторе, поэтому очистка определяется областью видимости, а не дисциплинированностью программиста. Дополнительный вопрос: что происходит с этой гарантией, если конструктор выбрасывает исключение в середине выполнения.
- Объясните правила трёх, пяти и нуля. Если вы определяете деструктор, конструктор копирования или оператор копирующего присваивания, вероятно, вам нужны все три; конструктор перемещения и оператор перемещающего присваивания расширяют список до пяти. Дополнительный вопрос: почему следует стремиться соблюдать правило нуля.
- Зачем полиморфному базовому классу виртуальный деструктор? Удаление производного объекта через указатель на базовый класс без виртуального деструктора приводит к неопределённому поведению. Дополнительный вопрос: когда защищённый невиртуальный деструктор будет более удачным решением.
- Что делает
std::move? Оно выполняет приведение к rvalue-ссылке, позволяя выбрать конструктор перемещения. Само оно ничего не перемещает, а перемещённый объект остаётся допустимым, но в неопределённом состоянии. Дополнительный вопрос: почему возвратstd::move(x)из функции может помешать устранению копирования. - Какой умный указатель выбрать и почему?
unique_ptr— для единоличного владения без дополнительных затрат во время выполнения,shared_ptr— когда владение действительно совместное,weak_ptr— для разрыва цикла ссылок. Дополнительный вопрос: что хранится в управляющем блоке и почему копированиеshared_ptrне бесплатно. - Назовите три способа получить неопределённое поведение. Стандартные три примера: чтение за пределами контейнера, использование ссылки на уничтоженный временный объект и гонка данных. Дополнительный вопрос: почему оптимизатор вправе предполагать, что этого никогда не происходит.
Вместе с ними задают вопросы о контейнерах: стоимость вставки в середину vector, операции, инвалидирующие итераторы, и ситуации, когда хеш-таблица уступает отсортированному вектору. Связанные подборки находятся в библиотеке вопросов.
Насколько глубоки вопросы о памяти и многопоточности?
Глубже, чем в большинстве языков, причём глубина зависит от должности. Команды прикладной разработки ограничиваются умными указателями и безопасностью исключений. Команды, занимающиеся системами, трейдингом и инфраструктурой, идут дальше — к выравниванию, работе кеша и модели памяти.
Безопасность исключений проверяют через знание терминов: базовая гарантия оставляет объекты в допустимом состоянии, строгая гарантия сохраняет состояние неизменным при сбое, а гарантия отсутствия исключений означает, что операция не может завершиться неудачей. Умение назвать гарантию, которую обеспечивает ваш собственный код, — именно тот ответ, который производит впечатление. Вопросы о многопоточности обычно начинаются с std::mutex и std::atomic, а затем проверяют, понимаете ли вы, что гонка данных — это неопределённое поведение, а не просто чтение устаревшего значения.
Системного инженера, проходившего собеседование на должность во встраиваемых системах у поставщика автомобильной отрасли, попросили проверить кольцевой буфер фиксированного размера, общий для обработчика прерываний и цикла задачи. Сначала он заметил несинхронизированный индекс, прямо сказал, что квалификатор volatile проблему не решит, и лишь затем обсудил подходящий порядок атомарных операций. То, что он сначала назвал неверное решение, а затем верное, показало понимание модели, а не знание эмпирического правила.
Если должность предполагает высокие требования к производительности, ожидайте вопроса о причинах медленной работы цикла с плохой локальностью данных. Проговорить такой разбор вслух с ИИ-интервьюером на странице пробного собеседования полезнее, чем перечитывать стандарт.
Как отрепетировать устную часть?
Ответы по C++ проваливаются по одной конкретной причине: кандидаты знают материал, но прячут главное. Отвечая на вопрос о виртуальных деструкторах, они начинают с устройства таблицы виртуальных функций и лишь в конце доходят до неопределённого поведения — либо не доходят вовсе. Сначала назовите последствие, затем объясните механизм.
Возьмите шесть вопросов выше и вслух ответьте на каждый примерно за тридцать секунд, начиная с последствия. Повторите весь набор на следующий день: отрабатывать стоит именно те ответы, которые забылись. Настройка пробной сессии описана на странице руководства.
Во время живого собеседования помощник, который слушает интервьюера и предлагает структуру ответа, полезен, когда вопрос касается редко используемой вами части языка. Он работает с настольными приложениями для встреч и звонками во вкладке браузера, причём никакой бот к звонку не присоединяется. Такой помощник недопустим на платформе оценки с прокторингом, при записи демонстрации экрана или на заблокированном корпоративном ноутбуке, а именно в таких условиях проходит большинство домашних и очных заданий по C++, поэтому решающее значение имеют ответы без подсказок.
Частые вопросы
К какому стандарту C++ следует готовиться?
Нужно ли уметь писать шаблоны с нуля?
Сырые указатели теперь считаются неправильным ответом?
Какую часть STL нужно помнить наизусть?
Что делать, если во время собеседования я не могу мысленно скомпилировать свой ответ?
Похожие вопросы
- Какие вопросы по TypeScript задают на собеседованиях?
- What questions get asked in a non-profit job interview?
- What Copilot and AI coding assistant questions do developers get asked in interviews?
- Какие вопросы задают на втором собеседовании?
- What questions are asked in a product designer interview?
- Какие вопросы задают на собеседовании full stack разработчика?