Что делает throw?

179
18 мая 2018, 17:30

При выполнение данного кода произошло создание трех объектов.
Если происходит создание одного или двух - я могу понять логику.
А при трех представить последовательность не получается.

1 объект: throw просто переводит выполнение на строку за подходящую catch-метку.

2 объекта: для объекта-операнда оператора throw создается копия, затем вызывается деструктор для obj, выполнение переходит на подходящую метку catch, выполняется тело метки, для копии вызывается деструктор.

class A
{
public:
    A(){ cout << "Constructor A" << endl;};
    A(const A &obj){ cout << "Copy A" << endl;};
    A& operator=(const A & obj){cout << "Assigment A" << endl; return *this;};
    ~A(){cout << "Destructor A" << endl;};
};

int main(void)
{
    try
    {
        A obj;
        throw obj;
    }
    catch(A object)
    {
        cout << "Hello!!!" << endl;
    }
    return 0;
}

Вывод программы:

Constructor A
Copy A
Destructor A
Copy A
Hello!!!
Destructor A
Destructor A
Answer 1

Все верно - создание копии для "бросания", уничтожение объекта в try-блоке, далее, поскольку вы передаете исключение в catch по значению, а не по ссылке - еже одно копирование. И под конец удаление обоих оставшихся объектов.

Напишите

catch(A& object)

и объектов будет только два.

READ ALSO
Мусор при сортировке

Мусор при сортировке

После сортировки в массиве NxN появляется мусор, с каждым разом мусор в разных местах

193
Проблема с transform-origin и transform: rotateX в Safari

Проблема с transform-origin и transform: rotateX в Safari

Столкнулся с проблемой, которая заключается в кривом отображении блока с текстом

218
Как расставить блоки по бокам ? (css)

Как расставить блоки по бокам ? (css)

Имеются 4 блокаУ каждого из них идентичный код, который приведен ниже

264
css: дочерний квадратный элемент

css: дочерний квадратный элемент

Подскажите, можно ли только с помощью одного css сделать следующее

205