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