При выполнение данного кода произошло создание трех объектов.
Если происходит создание одного или двух - я могу понять логику.
А при трех представить последовательность не получается.
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
Все верно - создание копии для "бросания", уничтожение объекта в try-блоке, далее, поскольку вы передаете исключение в catch по значению, а не по ссылке - еже одно копирование. И под конец удаление обоих оставшихся объектов.
Напишите
catch(A& object)
и объектов будет только два.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости