- •Вопрос 1. Ссылки и ссылочные параметры.
- •Вопрос 2. Перегрузка функций.
- •Вопрос 3. Шаблоны функций.
- •Вопрос 4. Использование const с указателями.
- •Вопрос 5. Область действия класса. Управление доступом к членам класса. Отделение интерфейса от реализации.
- •Вопрос 6. Понятие конструктора .Использование констр-ра с аргументами по умолчанию. Конструктор по умолчанию.
- •Вопрос 7. Понятие деструктора. Когда вызывается конструктор и деструктор.
- •Вопрос 8. Константные объекты и функции-члены.
- •Вопрос 9. Дружественные функции и друж. Классы.
- •Вопрос 10. Указатель this.
- •Вопрос 11. Операции new и delete.
- •Вопрос 12. Статические члены класса.
- •Вопрос 13. Понятие перегрузки операций.
- •Вопрос 14. Функции-операции как члены класса и как друж-е функции
- •Вопрос 15. Перегрузка операций ввода/вывода в поток, бинар и унар операций.
- •Вопрос 17. Перегрузка операций индексации массива.
- •Вопрос 18. Понятие наследования. Механизм ограничения доступа при наследовании.
- •Вопрос 19. Приведение типа указателя базового класса к указателю производного класса и наоборот.
- •Вопрос 21. Конструкторы и деструкторы в производных классах.
- •Вопрос 22. Неявное преобразование объектов производных классов в объекты базового класса.
- •Вопрос 23. Иерархия классов. Уровни наследования.
- •Вопрос 24. Множественное наследование.
- •Вопрос 25. Неопределённость при множ-м наследовании. Включение «классы в классах».
- •Вопрос 26. Понятие виртуальной функции.
- •Вопрос 27. Понятие полиморфизма.
- •Вопрос 28. Абстрактные и конкретные базовые классы.
- •Вопрос 29. Статическое и динамическое связывание.
- •Вопрос 30. Виртуальные деструкторы.
- •Вопрос 31. Шаблоны классов.
- •Вопрос 32. Шаблоны классов и пользовательские типы
- •Вопрос 33. Шаблоны и наследование.
- •Вопрос 34. Классы и объекты потоков ввода/вывода. Иерархия потоковых классов.
- •Вопрос 35, 38. Предопределённые потоковые объекты. Состояние ошибок потока.
- •Вопрос 36. Манипуляторы потоков.
- •Вопрос 37. Неформатированный ввод/вывод с помощью read/ write
- •Вопрос 38. Состояние ошибок ввода/вывода
- •Вопрос 39. Понятие исключения. Когда должна использоваться обработка исключений.
- •Вопрос 40. Генерация исключений. Повторная генерация исключений.
- •Вопрос 41. Перехват исключений.
- •Вопрос 42. Спецификация исключений. Обработка неожиданных исключений.
- •Вопрос 43. «Раскручивание» стека. Иерархия исключений стандартной библиотеки.
- •Вопрос 44. Конструкторы, деструкторы и исключения. Исключения и наследование.
- •Вопрос 45. Обработка неуспешного выполнения new.
- •Вопрос 46. Класс auto_ptr и динамич выделение памяти.
- •Вопрос 47. Static_cast, reinterpret_cast
- •Вопрос 48. Инфо о типе времени выполнения. Оператор dynamic_cast
- •Вопрос 49. Ключевое слово explicit.
- •Вопрос 50. Ключевое слово mutable.
- •Вопрос 51. Указатели на члены класса.
- •Вопрос 52. Множественное наследование. Виртуальные базовые классы.
- •Вопрос 53. Классы-контейнеры и классы-итераторы.
- •Вопрос 54. Понятие ооп. Три условия ооп-программы. Парадигмы ооп.
- •Вопрос 55.Основные составляющие объектного подхода: абстрагирование, инкапсуляция, модульность.
- •Вопрос 56. Основные составляющие объектного подхода: иерархия, типизация, полиморфизм.
- •Вопрос 57. Природа объекта. Состояние, поведение, идентичность объекта.
- •Вопрос 58. Отношения между объектами. Связи. Агрегация.
- •Вопрос 59. Природа классов. Отношения между классами. Типы отношений.
Вопрос 40. Генерация исключений. Повторная генерация исключений.
Ключевое слово throw используется для того, чтобы указать, какое исключение генерируется. Это называется генерацией исключения или возбуждением исключения. Обычно throw имеет один операнд. Операнд throw может быть любого типа.
После генерации исключение будет перехвачено ближайшим обработчиком исключений (ближайшим к блоку try, в котором было сгенерировано исключение). Обработчики исключений для блока try перечисляются сразу после него.
Может оказаться, что сам блок try не содержит никаких проверок ошибок и не включает никаких операторов throw, но код, вызываемый из блока try, может содержать контроль ошибок, например, в конструкторах.
Исключение может прервать выполнение программы, но это не обязательно. Однако, выполнение блока, в котором сгенерировано исключение, завершается.
Повторная генерация исключений
Если обработчик, который перехватил исключение, не может обработать его, обработчик может потребовать освободить ресурсы прежде, чем проводить дальнейшую обработку. В этом случае обработчик может просто повторно сгенерировать это исключение оператором throw;
Такой оператор throw без аргументов повторно генерирует то же самое исключение. Если никакое исключение не было сгенерировано, то оператор повторной генерации вызывает обращение к функции завершения terminate. Т.е. оператор throw должен появляться только в обработчике catch; в противном случае, он вызовет обращение к terminate.
Но даже если обработчик может обработать исключение и независимо от того, делает ли он какую-либо обработку этого исключения, он может повторно возбудить исключение для последующей обработки его вне этого обработчика.
Повторно сгенерированное исключение обнаруживается следующим внешним блоком try и перехватывается обработчиком из списка, следующего за этим внешним блоком try.
{ for(;;) { try
{ cout<<"…"<<endl }
catch(char *s)
{ cout<<” …. "<<endl; }
}
}
Вопрос 41. Перехват исключений.
try {
// Фрагмент, который может инициировать исключения
}
catch (Exception_Type t) {
// Восстановление после исключения типа Exception_Type
}
catch (...) {
// Восстановление после исключений всех остальных типов
}
Обработчики исключений содержатся в блоках catch. Каждый блок catch начинается с ключевого слова catch, за которым следуют круглые скобки, содержащие тип и необязательное имя параметра. Затем в фигурных скобках записываются операторы обработки исключения. Когда исключение перехвачено, начинает выполняться программа в блоке catch.
Исключение, у которого тип сгенерированного объекта соответствует типу аргумента в заголовке catch, вызывает выполнение программы обработки этого блока catch.
Исключение перехватывается первым обработчиком catch, следующим за активным в настоящее время блоком try и соответствующим типу сгенерированного объекта.
Исключение, которое не перехвачено, вызывает terminate, что по умолчанию приводит к вызову abort для аварийного завершения программы.
Если после catch в круглых скобках записано многоточие: catch (...) это означает, что будут перехватываться все исключения.
Возможно, что некоторому сгенерированному объекту не будет соответствовать ни один обработчик. Это вызывает продолжение поиска соответствия в следующем внешнем блоке try, включающем данные. При продолжении этого процесса в конечном счете может быть выяснено, что в программе не существует обработчика, который соответствовал бы типу сгенерированного объекта; в этом случае вызывается функция terminate, которая по умолчанию вызывает функцию abort
Обработчики исключений поочередно просматриваются в поисках соответствующего типа.
Возможно, что данному типу исключения будут соответствовать несколько обработчиков исключений. В этом случае выполняется первый обработчик, соответствующий типу исключения. Если данному типу соответствуют несколько обработчиков и если они отличаются друг от друга, то последовательность записи обработчиков будет влиять на способ, к-ым эти исключения будут обрабатываться.
Несколько обработчиков catch содержат тип класса, к-ый соответствует типу конкретного сгенерированного объекта,т.к.
существует обработчик catch (...), к-ый перехватит любое исключение.
из-за иерархии наследования объект производного класса может быть перехвачен как обработчиком данного класса, так и обработчиком любого базового класса, от к-ого порожден данный класс.
Иногда программа может обрабатывать многие близко связанные типы исключений. В этом случае можно создать один класс исключения и один обработчик catch для группы исключений.
Тип параметра в заголовке catch соответствует типу сгенерированного объекта, если:
они имеют одинаковый тип;
тип параметра обработчика catch явл-ся открытым базовым классом класса сгенерированного объекта;
параметр обработчика имеет тип указатель, и сгенерированный объект тоже имеет тип ук-ль, преобразуемый в тип параметра путем допустимых преобразований указателей. Например, указатель производного класса преобразуется в указатель базового класса стандартными операциями преобразования;
обработчик catch записан в форме catch (...).
По умолчанию, если никакой обработчик для исключения не найден, программа завершается.
Способы написания обработчиков ошибок:
можно рассмотреть ошибку и решить вызвать функцию terminate.
можно преобразовать один тип исключения в другой, генерируя это другое исключение.
можно выполнить любые необходимые восстановления и продолжить выполнение с первого оператора после последнего обработчика исключения.
можно рассмотреть ситуацию, вызвавшую ошибку, удалить причину ошибки и повторить вызов первоначальной функции, к-ая вызвала исключение (это не должно создавать бесконечную рекурсию).
можно просто возвращать некоторое значение состояния в среду и т.д.
Последовательность обработчиков catch. Обработчики, к-рые перехватывают объекты производных классов, должны быть помещены перед обработчиками, к-рые перехватывают объекты базового класса.
Блок catch может обрабатывать ошибку способом, который дает возможность программе продолжать выполняться правильно. Или блок catch может завершить программу.