608________________________________Часть IV. Новые возможности C++
¦set_tenninate()), вызов throw приведет к немедленному завершению вашей программы (более подробно о функции terminate см. далее в разделе "Задание собственного обработчика завершения").
Генерация исключительных ситуаций в конструкторах. До появления механизма обработки исключительных ситуаций одним из самых больших недостатков C++ было отсутствие простого способа сигнализации об ошибках из конструкторов объектов. Для этого обычно приходилось пускаться на хитрости, передавая в конструктор переменные ошибок (знакомо звучит?) и используя внутренние переменные состояния объекта. По этой причине многие специалисты C++ рекомендовали полный отказ от распределения ресурсов в конструкторе.
С появлением механизма обработки исключительных ситуаций положение кардинально изменилось. Исключительные ситуации можно генерировать в конструкторах так же, как и в любом другом месте. Когда генерируется такая исключительная ситуация, процесс конструирования нового объекта прерывается. Если до генерации исключительной ситуации базовые классы успешно построены, то деструкторы классов вызываются в обратном порядке. Если некие объекты локальны по отношению к конструктору, то можно ручаться, что будут вызваны деструкторы и этих объектов.
Чтобы продемонстрировать описанный подход, в листинге 22.20 приведена программа с классами вазе и Derived, в которой конструирование объекта Derived прерывается непосредственно в конструкторе.
// Необходимые заголовки ttinclude <iostream.h>
class LocaiGuy
{
public:
LocaiGuy() ( cout « "В конструкторе LocaiGuy.\n";
-LocaiGuy(•) { cout « "В деструкторе LocaiGuy.\n";
i .
class Base
{
pubi_ic;
Basel) ( cout « "В конструкторе Base.\n"; }
-Base() { cout « "В деструкторе Base.\n"; )
class Derived: public Base
{
public:
Derived(int flag)