P
prepair.app
Пройти интервью →
EnglishУкраїнськаРусский
🔷

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

Middle · 2–4 года опыта

Собеседование по C++ проверяет три вещи: понимаете ли вы объектную модель, можно ли доверить вам память и знаете ли вы, чего стоит стандартная библиотека. Ниже вопросы, которые задают чаще всего, каждый с эталонным ответом. Middle: более глубокое понимание, оптимизацию и реальные рабочие ситуации.

Темы для подготовки

Память, указатели и RAII
ООП, виртуальные функции и vtable
Move-семантика и правило пяти
Шаблоны и метапрограммирование
Контейнеры STL и сложности
Многопоточность и гонки данных

6 вопросов уровня Middle с ответами

1

Что такое правило пяти и что компилятор генерирует сам?

Ответ

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

2

Что на самом деле делает `std::move`?

Ответ

Во время выполнения — ничего. Это безусловное приведение к rvalue-ссылке, которое меняет разрешение перегрузки так, что может быть выбран move-конструктор или move-присваивание. Если у типа перемещающих операций нет, выбирается копирование, и код молча продолжает копировать. После перемещения источник валиден, но содержимое не определено: ему можно присвоить или его можно разрушить, но полагаться на содержимое нельзя.

3

Что такое copy elision и RVO?

Ответ

Это когда компилятор конструирует возвращаемый объект прямо в памяти вызывающей стороны, вместо того чтобы построить его и затем скопировать или переместить. Именованная и безымянная RVO долго были оптимизациями, которым разрешалось убирать наблюдаемые побочные эффекты; с C++17 элизия для prvalue обязательна. Практический вывод: возврат по значению не является пессимизацией, как всё ещё принято считать, а return std::move(x) обычно делает хуже, блокируя NRVO.

4

Когда инвалидируются итераторы?

Ответ

Это зависит от контейнера, и знать стоит точно. vector инвалидирует всё при реаллокации и всё начиная с точки удаления; deque при вставке в середину инвалидирует все итераторы; list и ассоциативные контейнеры сохраняют итераторы, кроме указывающего на удалённый элемент. Классический баг — удаление внутри цикла, поэтому erase возвращает следующий валидный итератор и поэтому существует идиома erase-remove.

5

`std::map` против `std::unordered_map` — как выбирать?

Ответ

map — сбалансированное дерево: упорядоченный обход, поиск за O(log n), стабильные итераторы, предсказуемость. unordered_map — хеш-таблица: в среднем O(1), но в худшем O(n), без порядка, рехеширование инвалидирует итераторы, и всё зависит от качества хеша. map берут, когда нужен порядок или ограниченный худший случай, unordered_map — когда доминируют поиски, а порядок не важен.

6

Какие бывают гарантии безопасности исключений?

Ответ

Четыре уровня: no-throw, строгая (операция либо завершается, либо оставляет состояние неизменным), базовая (инварианты держатся и ничего не течёт, но состояние могло измениться) и никакой. Строгую обычно реализуют работой на копии со свопом в конце. Деструктор бросать не должен: во время раскрутки стека второе исключение вызывает std::terminate, поэтому деструкторы по умолчанию noexcept.

🦎

Прочитать ответы недостаточно

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

Пройти интервью Middle C++ →
Бесплатно · 3 интервью в месяц

Другие уровни — C++

Junior C++Senior C++Все вопросы C++

Другие специализации

🔍Middle QA Manual🤖Middle QA AutomationMiddle Java Backend🐍Middle Python Backend🐘Middle PHP Backend🦫Middle Go Backend🟢Middle Node.js Backend💎Middle Ruby on Rails🟨Middle JavaScript⚛️Middle React Frontend