Font size
Worksheetsквиз
Total questions: 21
Worksheet time: 16mins
Какое из утверждений про ссылки и указатели неверно?
`int& r = x;` — ссылка на `x`
`int* p = &x;` — указатель на `x`
Ссылку можно переназначить после инициализации
Указатель может хранить `nullptr`
Что инвалидирует итераторы `std::vector<T>`? (может быть несколько ответов)
`v.push_back(x)` при недостаточном `capacity`
`v.reserve(new_cap)` при `new_cap > capacity`
`v.clear()`
`v[ i ] = value`
Что такое чисто виртуальная функция?
`virtual void f() { … }`
`virtual void f() = 0;`
`void f() const;`
`virtual void f() override;`
Когда нужен виртуальный деструктор в базовом классе?
Всегда, если есть виртуальные функции
Только если планируется удаление через `Base*`
Никогда, если нет данных
Если класс абстрактный
Какие виды полиморфизма есть в C++?
Параметрический (шаблоны)
Ad-hoc (перегрузка)
Subtype (виртуальные функции)
Duck typing
В чём проблема “алмаза” (Diamond) при множественном наследовании?
Несколько базовых объектов одного типа
Неоднозначность доступа к членам
Отсутствие виртуальных функций
Утечка памяти
Как работает vtable (таблица виртуальных функций)?
Один на объект
Один на класс
Содержит указатели на виртуальные методы
Меняется в рантайме при каждом вызове
Чем отличается `unique_ptr<T>` от `shared_ptr<T>`?
`unique_ptr` нельзя копировать
`unique_ptr` нельзя перемещать
`shared_ptr` считает ссылки
`shared_ptr` всегда медленнее
Зачем нужен `weak_ptr<T>`?
Для разделяемого владения
Чтобы разорвать циклические ссылки
Чтобы хранить указатель без увеличения счётчика
Для передачи владения
Почему `make_unique<T>()` предпочитают прямому `new T`?
Безопасность при исключениях
Меньше кода
Всегда эффективнее
Создает указатель на несколько объектов сразу
Как передать `unique_ptr<T>` в функцию, чтобы она взяла владение?
`void f(unique_ptr<T>& p); f(ptr);`
`void f(unique_ptr<T> p); f(move(ptr));`
`void f(const unique_ptr<T>& p); f(ptr);`
`void f(unique_ptr<T>&& p); f(move(ptr));`
При каком порядке `catch` блоков правильно обрабатывать исключения?
От специфичных к общим
От общих к специфичным
Любой
С `catch(...)` последним
Какой из компараторов для `std::priority_queue<Task, …>` задаёт приоритет по убыванию `priority`, а при равном — по возрастанию `duration`?
`a.priority < b.priority`
`a.priority > b.priority`
`a.duration < b.duration`
`a.duration > b.duration`
Какие утверждения про ссылки в C++ верны?
Ссылку нужно инициализировать при объявлении
Ссылка не может быть переназначена на другой объект после инициализации
Ссылку можно инициализировать константой
Ссылка может быть равна nullptr
Какие утверждения про указатели в C++ неверны?
Можно объявить указатель и сразу инициализировать его значением nullptr
Разыменование указателя всегда безопасно без дополнительных проверок
Можно иметь указатель на ссылку
Арифметика указателей допустима только для элементов одного массива
Какие утверждения про шаблоны в C++ верны?
Частичная специализация доступна для шаблонов функций
Частичная специализация доступна только для шаблонов классов
Шаблон функции можно перегрузить
Полная специализация позволяет задать альтернативную реализацию для конкретного набора параметров
В чём разница между указателем и ссылкой?
Указатель может быть `nullptr`, ссылка — нет
Ссылку можно переназначить после инициализации
Указатель — самостоятельная переменная, ссылка — псевдоним
Ссылку можно разыменовать через `*`, указатель — нет
Чем отличается `std::vector` от `std::deque`?
`vector` гарантирует стабильность адресов при `push_front()`
`deque` поддерживает эффективное `push_front()`
`vector` хранит данные кусочно-непрерывно
`deque` — сплошной массив в куче
Какую категорию итераторов поддерживает только `std::vector`?
Input Iterator
Forward Iterator
Bidirectional Iterator
Random Access Iterator
Что можно сделать с `unique_ptr<T>`?
Скопировать
Переместить
Передать по значению в функцию, берущую владение
Извлечь `use_count()`
Когда нужен `virtual` деструктор?
Если класс содержит виртуальные методы
Если объекты удаляются через указатель на базовый
Всегда, даже без наследования
Только в шаблонных классах
