Как пройти собеседование по C++: топ вопросов от А до Я
Собеседование на позицию C++ разработчика — это проверка не только знания синтаксиса, но и глубокого понимания работы компилятора, управления памятью и особенностей объектно-ориентированного программирования. В этой статье мы разобрали топ вопросов от А до Я, которые чаще всего задают на собеседованиях. Материал будет полезен как junior-разработчикам, так и тем, кто готовится к middle-уровню.
1. Основы синтаксиса и типы данных
Начнем с базы — вопросов, которые проверяют ваше понимание фундаментальных концепций C++.
1.1. Чем отличается ссылка от указателя?
Это классический вопрос. Основные отличия:
- Ссылка не может быть
nullptr, указатель — может. - Ссылку нельзя перепривязать к другому объекту после инициализации.
- Указатель поддерживает арифметику, ссылка — нет.
int a = 5;
int& ref = a; // ссылка
int* ptr = &a; // указатель
ref = 10; // a = 10
*ptr = 20; // a = 20
1.2. Что такое const и как его правильно использовать?
const в C++ используется для защиты данных от изменения. Важно различать const перед типом и после него:
const int* ptr— указатель на константное целое (менять значение по адресу нельзя).int* const ptr— константный указатель на целое (менять адрес нельзя).
2. Объектно-ориентированное программирование (ООП)
Вопросы по ООП — обязательная часть собеседования по C++. Разберем ключевые темы.
2.1. Виртуальные функции и полиморфизм
Виртуальные функции обеспечивают позднее связывание (динамический полиморфизм). Пример:
class Base {
public:
virtual void show() { std::cout << "Base\n"; }
virtual ~Base() = default;
};
class Derived : public Base {
public:
void show() override { std::cout << "Derived\n"; }
};
int main() {
Base* b = new Derived();
b->show(); // Выведет "Derived"
delete b;
}
Важно помнить про виртуальный деструктор — без него при удалении объекта через указатель на базовый класс будет вызван только деструктор базового класса, что приведет к утечке памяти.
2.2. Чисто виртуальные функции и абстрактные классы
Класс, содержащий хотя бы одну чисто виртуальную функцию (= 0), становится абстрактным. Нельзя создать экземпляр такого класса — только наследника с реализацией всех чисто виртуальных методов.
2.3. Что такое vtable и vptr?
Для реализации полиморфизма компилятор создает виртуальную таблицу (vtable) для каждого класса с виртуальными функциями. Каждый объект содержит скрытый указатель (vptr) на эту таблицу. Вызов виртуальной функции происходит через косвенное обращение по vptr, что добавляет небольшие накладные расходы.
3. Управление памятью и умные указатели
C++ предоставляет разработчику полный контроль над памятью, что требует особой аккуратности.
3.1. Разница между new/delete и malloc/free
mallocвыделяет память, но не вызывает конструктор.freeосвобождает память без вызова деструктора.newвыделяет память и вызывает конструктор.deleteвызывает деструктор и освобождает память.
3.2. Умные указатели: unique_ptr, shared_ptr, weak_ptr
Умные указатели автоматически управляют временем жизни объекта. Ключевые моменты:
std::unique_ptr— эксклюзивное владение, нельзя копировать, только перемещать.std::shared_ptr— разделяемое владение через счетчик ссылок.std::weak_ptr— не увеличивает счетчик ссылок, используется для предотвращения циклических зависимостей.
#include <memory>
std::unique_ptr<int> uptr = std::make_unique<int>(10);
std::shared_ptr<int> sptr = std::make_shared<int>(20);
std::weak_ptr<int> wptr = sptr; // не увеличивает счетчик
3.3. Что такое утечка памяти и как ее избежать?
Утечка памяти возникает, когда память выделяется, но не освобождается. Современные подходы к предотвращению:
- Использовать умные указатели вместо сырых.
- Применять RAII (Resource Acquisition Is Initialization).
- Избегать ручного вызова
new/deleteбез крайней необходимости.
4. STL и шаблоны
Стандартная библиотека шаблонов (STL) — неотъемлемая часть C++. Знание контейнеров и алгоритмов обязательно.
4.1. Основные контейнеры: vector, list, map, unordered_map
std::vector— динамический массив, быстрый доступ по индексу, медленная вставка в середину.std::list— двусвязный список, быстрая вставка/удаление в любом месте, медленный доступ по индексу.std::map— отсортированное дерево (обычно красно-черное), логарифмическая сложность операций.std::unordered_map— хеш-таблица, константная сложность в среднем.
4.2. Итераторы и их виды
Итераторы — это обобщенный способ доступа к элементам контейнера. Виды итераторов:
- Input/Output — однонаправленные, только чтение/запись.
- Forward — однонаправленные,