C++ — язык с репутацией сложного собеседования. Здесь проверяют управление памятью, указатели, ООП и знание STL. Вот 30 вопросов, которые задают реально.
Как подготовиться к собеседованию junior
Память и указатели (вопросы 1–10)
1. Чем стек отличается от кучи (heap)?
Стек — автоматическое управление памятью, LIFO, быстрый доступ, ограниченный размер. Heap — динамическое выделение (`new`/`delete`), больший объём, медленнее, нужно освобождать вручную.
2. Что такое указатель?
Переменная, хранящая адрес памяти. `int ptr = &var;`. `ptr` — разыменование (значение по адресу). `&var` — адрес переменной.
3. Чем указатель отличается от ссылки?
Ссылка — псевдоним, не может быть nullptr, не переприсваивается после инициализации. Указатель — адрес, может быть nullptr, может указывать на разные объекты.
4. Что такое `nullptr`?
Безопасный нулевой указатель (C++11). Заменяет `NULL` и `0`. Явно типизирован, не приводится к `int` неявно.
5. Что такое утечка памяти?
Выделенная через `new` память не освобождена через `delete`. Приводит к росту потребления памяти. Инструмент диагностики: Valgrind.
6. Что такое `smart pointer`? Виды?
`unique_ptr` — единственный владелец, не копируется. `shared_ptr` — разделяемое владение (счётчик ссылок). `weak_ptr` — не владеет, не увеличивает счётчик (разрывает циклические зависимости).
7. Что такое dangling pointer?
Указатель на освобождённую память. Обращение к нему — undefined behavior. Предотвращение: `delete ptr; ptr = nullptr;` или smart pointers.
8. Что такое double free?
Попытка освободить уже освобождённую память. Undefined behavior. Предотвращение: smart pointers.
9. Что такое `const` с указателями?
`const int ptr` — нельзя изменить значение через ptr. `int const ptr` — нельзя изменить адрес. `const int* const ptr` — оба ограничения.
10. Что такое `new[]` и `delete[]`?
Для массивов: `int* arr = new int[10];` — выделить. `delete[] arr;` — освободить. Смешивать `delete` и `new[]` — undefined behavior.
ООП и синтаксис (вопросы 11–20)
11. Что такое виртуальная функция?
`virtual` — функция, переопределяемая в производных классах. Вызывается через указатель на базовый класс с учётом реального типа объекта (полиморфизм). Механизм — vtable (таблица виртуальных функций).
12. Что такое чисто виртуальная функция?
`virtual void func() = 0;` — класс становится абстрактным, нельзя инстанциировать. Производный класс обязан переопределить.
13. Что такое конструктор копирования?
Вызывается при копировании объекта: `MyClass b = a;`. По умолчанию — поверхностная копия. Для объектов с динамической памятью нужна глубокая копия (правило трёх/пяти).
14. Что такое оператор присваивания?
`MyClass& operator=(const MyClass& other)`. Вызывается при `a = b;`. Нужно проверить самоприсваивание: `if (this == &other) return *this;`.
15. Что такое Rule of Three / Five?
Если нужен деструктор — нужны конструктор копирования и оператор присваивания (Rule of Three). В C++11+: плюс конструктор перемещения и оператор перемещения (Rule of Five).
16. Что такое `move` семантика?
C++11. Передача ресурсов без копирования: `std::move(obj)`. `&&` — rvalue reference. Перемещение быстрее копирования для тяжёлых объектов (векторы, строки).
17. Что такое `inline` функция?
Подсказка компилятору встроить тело функции в место вызова. Убирает накладные расходы на вызов функции. Компилятор может проигнорировать.
18. Что такое `explicit`?
Запрещает неявное преобразование типов при вызове конструктора с одним аргументом.
19. Что такое `friend`?
Объявляет функцию или класс другом — даёт доступ к приватным членам. Используется осторожно, нарушает инкапсуляцию.
20. Что такое `template`?
Параметризованный код, работающий с разными типами. `template<typename T> T max(T a, T b)`. Конкретизируется при компиляции. Основа STL.
STL и современный C++ (вопросы 21–30)
21. Что такое STL?
Standard Template Library: контейнеры (`vector`, `map`, `set`), алгоритмы (`sort`, `find`, `transform`), итераторы. Основа идиоматичного C++ кода.
22. Чем `vector` отличается от `list`?
`vector` — динамический массив: O(1) доступ по индексу, O(n) вставка в середину. `list` — двусвязный список: O(n) доступ, O(1) вставка с итератором.
23. Что такое `map` vs `unordered_map`?
`map` — красно-чёрное дерево, O(log n), ключи отсортированы. `unordered_map` — хеш-таблица, O(1) среднее, ключи не отсортированы.
24. Что такое `auto`?
Вывод типа компилятором: `auto x = 42;` — `int`. `auto it = vec.begin();` — не нужно писать длинный тип итератора.
25. Что такое range-based for?
`for (const auto& elem : container) { }` — итерация по контейнеру без индекса. Чище и безопаснее.
26. Что такое `lambda` в C++?
Анонимная функция: `capture { body }`. `[&]` — захват по ссылке, `[=]` — по значению. Используется в алгоритмах STL.
27. Что такое `std::algorithm`?
Набор обобщённых алгоритмов: `sort`, `find`, `find_if`, `count_if`, `transform`, `accumulate`, `copy_if`. Работают через итераторы.
28. Что такое RAII?
Resource Acquisition Is Initialization. Ресурс захватывается в конструкторе и освобождается в деструкторе. Smart pointers — реализация RAII для памяти.
29. Что такое `namespace`?
Область видимости для имён. `std::` — стандартный namespace. `using namespace std;` — опасно в headers, засоряет глобальное пространство.
30. Что такое `constexpr`?
Вычисление значений во время компиляции. `constexpr int square(int x) { return x*x; }`. Быстрее `const`, так как константа вычисляется один раз при компиляции.
FAQ
Нужно ли знать ассемблер для C++ junior?
Нет. Полезно понимать, во что компилируется код, но писать на ассемблере не нужно.
Где тренироваться в C++?
Codeforces, LeetCode (C++), Competitive Programming — для алгоритмов. Реальные pet-проекты — для понимания языка на практике.
---