Найдите и исправьте ошибки в приведённой программе

Исправьте имя деструктора на ~A, восстановите скобки try/catch и уберите исключение из деструктора. Тогда внешний throw 32 будет нормально перехвачен, и программа выведет 32.

Короткий ответ

Что ответить на собеседовании

Исправьте имя деструктора на ~A, восстановите скобки try/catch и уберите исключение из деструктора. Тогда внешний throw 32 будет нормально перехвачен, и программа выведет 32.

Подробный разбор

Ответ с пояснениями

Условие

В следующем фрагменте кода присутствуют синтаксические и логические ошибки, из‑за которых программа не компилируется и не работает корректно. Исправьте их, чтобы код успешно собирался и выполнялся.

# include <iostream>

class A {
public:
    A() {}
    ^A() {
    throw 42;
    }
};

int main(int argc, const char * argv[]) {
    try {
    A a;    [
    throw 32;
    catch(int a) {
    std::cout << a;
    }
}

Ответ

Исправьте имя деструктора на ~A, восстановите скобки try/catch и уберите исключение из деструктора. Тогда внешний throw 32 будет нормально перехвачен, и программа выведет 32.

#include <iostream>

class A {
public:
    A() = default;
    ~A() noexcept = default;
};

int main() {
    try {
        A object;
        throw 32;
    } catch (int value) {
        std::cout << value;
    }
}

Одна лишь правка синтаксиса недостаточна: throw 42 из деструктора при обработке throw 32 приводит к std::terminate. Даже noexcept(false) не делает такую ситуацию безопасной; очистка должна завершаться без выходящего исключения.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее