Рубрики

Обработка исключений и уничтожение объектов | Комплект 1

Предсказать вывод следующей программы на C ++.

#include <iostream>

using namespace std;

  

class Test {

public:

  Test() { cout << "Constructing an object of Test " << endl; }

  ~Test() { cout << "Destructing an object of Test "  << endl; }

};

  

int main() {

  try {

    Test t1;

    throw 10;

  } catch(int i) {

    cout << "Caught " << i << endl;

  }

}

Выход:

  Constructing an object of Test
  Destructing an object of Test
  Caught 10

Когда генерируется исключение, деструкторы объектов (область действия которых заканчивается блоком try) автоматически вызываются до того, как будет реализован блок catch. Вот почему вышеприведенная программа печатает «Уничтожение объекта теста» перед «Поймано 10».

Что происходит, когда исключение выдается из конструктора? Рассмотрим следующую программу.

#include <iostream>

using namespace std;

  

class Test1 {

public:

  Test1() { cout << "Constructing an Object of Test1" << endl; }

  ~Test1() { cout << "Destructing an Object of Test1" << endl; }

};

  

class Test2 {

public:

  // Следующий конструктор генерирует целочисленное исключение

  Test2() { cout << "Constructing an Object of Test2" << endl; 

            throw 20; }

  ~Test2() { cout << "Destructing an Object of Test2" << endl; }

};

  

int main() {

  try {

    Test1 t1;  // Построен и разрушен

    Test2 t2;  // Частично построен

    Test1 t3;  // t3 не создан, так как этот оператор никогда не выполняется

  } catch(int i) {

    cout << "Caught " << i << endl;

  }

}

Выход:

  Constructing an Object of Test1
  Constructing an Object of Test2
  Destructing an Object of Test1
  Caught 20

Деструкторы требуются только для полностью построенных объектов. Когда конструктор объекта выдает исключение, деструктор для этого объекта не вызывается.

В качестве упражнения предсказать вывод следующей программы.

#include <iostream>

using namespace std;

  

class Test {

  static int count;

  int id;

public:

  Test() {

    count++;

    id = count;

    cout << "Constructing object number " << id << endl;

    if(id == 4)

       throw 4;

  }

  ~Test() { cout << "Destructing object number " << id << endl; }

};

  

int Test::count = 0;

  

int main() {

  try {

    Test array[5];

  } catch(int i) {

    cout << "Caught " << i << endl;

  }

}

Мы расскажем больше об этой теме в отдельном посте. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Обработка исключений и уничтожение объектов | Комплект 1

0.00 (0%) 0 votes