Как пройти собеседование по C++: топ вопросов от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Как пройти собеседование по 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 — однонаправленные,

Блоги

Рекомендаций по книгам