42 вопроса
Практика
Можешь объяснить, что такое stack unwinding и что происходит с локальными объектами во время этого процесса при обработке исключений?
Какие лучшие практики для ловли исключений в C++, и почему ловля по ссылке в целом предпочтительнее, чем ловля по значению или указателю?
Когда ты определяешь деструктор для класса, нужно ли явно вызывать деструкторы его объектов-членов?
Какие типы объектов нужно выбрасывать как исключения в C++?
Как использование try, catch и throw улучшает качество софта по сравнению с return codes и условными операторами при обработке ошибок?
Стоит ли ловить исключения по указателю в MFC, или тебе лучше использовать другой подход?
Когда объект выбрасывается как исключение, сколько раз он может копироваться в этом процессе и какие факторы на это влияют?
Как ты можешь обеспечить, чтобы исключения выбрасывались полиморфно в C++, и какой правильный подход избежать неожиданного поведения при обработке исключений, когда работаешь с производными классами?
Что такое виртуальный деструктор и почему он важен, когда ты работаешь с наследованием и уничтожением объектов?
Какие лучше всего практики соблюдать при обработке ошибок, которые происходят в деструкторе, и почему так критично не выбрасывать исключения из деструкторов?
Какая цель использовать `throw;` (без объекта исключения после ключевого слова `throw`)? В каких ситуациях это было бы полезно?
Что происходит, когда функция выбрасывает исключение, которое не включено в её спецификацию исключений, и какое поведение по умолчанию в такой ситуации?
В строке `Fred* p = new Fred();` память, выделенная для объекта `Fred`, утечёт, если конструктор `Fred` выбросит исключение?
Нужно ли проверять pointer на NULL после использования оператора new, типа в выражении `p = new Fred()`?
Как правильно обработать ситуацию, когда конструктор не инициализирует объект нормально?
Зачем объявлять деструктор как static, и в каких ситуациях это может быть полезно?
Когда класс должен иметь виртуальный деструктор и почему это важно в объектно-ориентированном программировании?
Что такое виртуальный деструктор и почему важно объявить деструктор виртуальным в базовом классе, когда ты работаешь с объектами производных классов?
Когда ты реализуешь деструктор в производном классе, нужно ли явно вызывать деструктор базового класса?
Можно ли явно вызвать деструктор объекта, который был выделен с помощью new, и если нет, то почему нужно использовать оператор delete вместо этого?
Что делать, если ты не можешь ограничить время жизни локальной переменной, заключив её в искусственный блок, и как ты можешь добиться поведения, похожего на деструктор, добавив функцию-член без прямого вызова самого деструктора?
Как ты можешь убедиться, что локальный объект будет уничтожен и его деструктор вызовется перед концом его области видимости, особенно когда тебе нужны побочные эффекты деструктора, типа закрытия файла, в конкретном месте кода?
Нужно ли явно вызывать деструктор для локальной переменной?
В каком порядке вызываются деструкторы для объектов, которые хранятся в массиве, и какие ограничения есть на определение и вызов деструкторов?
В каком порядке уничтожаются локальные объекты и как это связано с порядком их создания? Например, если два объекта, `a` и `b`, созданы в этом порядке внутри функции, какой из них уничтожится первым?
Можешь объяснить, для чего нужен виртуальный деструктор в объектно-ориентированном программировании и почему он важен?
Опиши ситуацию, когда С++ программа может упасть ещё до того, как вообще выполнится функция main(), даже если ты поставил брейкпоинт в начало main().
Какие неявно объявленные функции-члены класса существуют, и какие функции компилятор сам генерирует, если ты их не определил явно?
Что такое "Named Constructor Idiom" и как он решает проблемы, связанные с наличием нескольких конструкторов в классе?
Можно ли использовать указатель this в конструкторе, и если да, то в каких случаях?
Какой рекомендуемый способ инициализировать переменные члена класса в конструкторе — список инициализации или присваивание — и в каких случаях от этой рекомендации можно отступить?
Какой конструктор вызывается при создании массива объектов Fred, и какие там разницы между использованием массивов и std::vector при инициализации объектов?
У класса Fred всегда определён конструктор по умолчанию как Fred::Fred()?
Можно ли одному конструктору класса вызвать другой конструктор того же класса, чтобы инициализировать текущий объект?
Можешь объяснить, что такое conversion constructor и дать пример того, как он позволяет делать неявное преобразование типов в C++?
Копи-конструктор может принять объект того же класса как параметр, а не ссылку на объект?
В каких ситуациях вызывается конструктор копирования?
Что такое copy constructor и как он используется при инициализации объектов?
Что такое конструктор по умолчанию и чем он отличается от других типов конструкторов по тому, как он обрабатывает аргументы?
Может ли конструктор выбросить исключение? И если да, то как вообще нужно обрабатывать такие ошибки?
Что такое конструктор и чем он отличается от других методов в классе?
Можно ли в объектно-ориентированном программировании сделать конструктор виртуальным? Если да, то как это реализовать? Если нет, то почему конструктор не может быть виртуальным?