Вопросы по C++ на собеседовании и ответы на них

Автор: Aaron Cao · Обновлено

Вопросы по C++ на собеседовании и ответы на них
Собеседования по C++ сосредоточены на времени жизни и владении: RAII, правиле пяти, семантике перемещения и выборе подходящего умного указателя. Ожидайте ловушек с неопределённым поведением, вопроса о виртуальном деструкторе и практического этапа, где нужно устранить утечку или висячую ссылку, вслух объясняя ход рассуждений.

Собеседования по 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++ следует готовиться?

Сначала уточните, а затем готовьтесь именно к нему. Большинство команд проводят собеседования, считая C++17 базовым уровнем, и ценят владение концептами и диапазонами C++20. В сфере встраиваемых систем и игр часто используют C++11 или C++14 и могут запрещать исключения и выделение памяти в куче.

Нужно ли уметь писать шаблоны с нуля?

На уровне прикладной разработки — редко. Вы должны уметь читать шаблон, объяснять, какие сущности создаёт компилятор, и рассказывать, что делает SFINAE или концепт C++20. Но на должностях, связанных с библиотеками и инструментами, написать шаблон действительно могут попросить.

Сырые указатели теперь считаются неправильным ответом?

Нет, и утверждение обратного вам навредит. Сырой указатель, который наблюдает за объектом, но не владеет им, корректен и не требует дополнительных затрат. Неправилен сырой указатель, владеющий объектом, потому что именно владение читатель не может определить по типу.

Какую часть STL нужно помнить наизусть?

Контейнеры, их вычислительную сложность и операции, инвалидирующие итераторы. Названия алгоритмов, кроме самых распространённых, можно найти в документации, и интервьюеры обычно разрешают это, если спросить.

Что делать, если во время собеседования я не могу мысленно скомпилировать свой ответ?

Скажите, что именно компилятор, по вашему мнению, отклонит и почему. Рассуждать вслух о разрешении перегрузок или времени жизни, в котором вы не уверены, лучше, чем молчать; услышав ваш метод, интервьюеры часто подсказывают недостающую деталь.

Похожие вопросы

← Подробнее: Вопросы на собеседовании по роли и теме