
- •1. Основные типы данных, объявление пользовательских типов данных typedef
- •Int (целочисленный тип)
- •2. Основные директивы препроцессора. Макросы
- •3. Указатели и динамическая память
- •4. Понятие функций. Механизм вызова функций и передача параметров
- •5. Передача и возврат параметров по значению и по указателю
- •6. Ссылки и ссылочные параметры
- •7. Перегрузка функций
- •8. Использование спецификатора const с указателями.
- •9. Понятие идентификатора. Пространства имен. Ключевое слово namespace
- •10. Анонимные пространства имен. Ключевое слово using.
- •11. Понятие структур. Оператор доступа к полям структуры по указателю.
- •12 . Понятие класса и объекта.
- •13. Время жизни переменных и объектов.
- •14. Область действия класса. Управление доступом к членам класса. Отделение интерфейса от реализации
- •15 . Понятие конструктора. Использование конструктора с аргументами по умолчанию. Конструктор по умолчанию.
- •16. Понятие деструктора. Когда вызываются конструкторы и деструкторы.
- •17. Константные объекты и функции-члены.
- •18. Дружественные функции и дружественные классы.
- •19. Использование указателя this.
- •20. Использование операции new и delete.
- •21. Статические члены класса.
- •25.Функции-операции как члены класса и как дружественные функции.
- •26.Перегрузка операции присваивания. Условия вызова оператора присваивания и конструктора копирования.
- •27. Понятие наследования. Механизм ограничения доступа при наследовании.
- •28.Приведение типа указателя базового класса к указателю производного класса и наоборот.
- •29.Переопределение членов базового класса в производном классе.
- •30. Конструкторы и деструкторы в производных классах
- •32. Неявный вызов конструкторов объектов
- •33. Понятие виртуальной функции
- •34. Понятие полиморфизма (примеры)
- •35. Абстрактные и конкретные базовые классы
- •36. Статическое и динамическое связывание
- •37. Виртуальные деструкторы
- •38. Шаблоны. Шаблонная функция
- •39. Шаблоны классов. Применение. Параметры шаблона типа typename
- •40. Шаблоны классов и наследование.
- •41. Шаблоны. Инстанцирование шаблонов и спецификация шаблонов
- •42. Понятие исключения. Когда должна использоваться обработка исключений.
- •43. Генерация исключений. Повторная генерация исключений
- •44. Перехватывание исключений
- •45. Спецификация исключений. Обработка неожидаемых исключений.
- •46. «Раскручивание» стека. Иерархия исключений стандартной библиотеки
- •47. Конструкторы, деструкторы и обработка исключений. Исключения и наследование.
- •48. Обработка неуспешного выполнения new
- •49. Стандартная библиотека шаблонов (stl). Основные типы контейнеров
- •50. Стандартная библиотека шаблонов (stl). Алгоритмы, методы, итераторы
- •51. Последовательные контейнеры: vector, list, deque. Основные методы и алгоритмы
- •52. Ассоциативные контейнеры: set, multiset, map, multimap. Основные методы и алгоритмы.
- •53. Операторы приведения типов static_cast, reinterpret_cast
- •54. Информация о типе времени выполнения (rtti). Использование функции typeid(). Оператор dynamic cast
- •55. Ключевое слово ехрlicit.Ключевое слово mutable
- •56. Классы-контейнеры и классы-итераторы
- •57. Понятие ооп. Парадигмы ооп (инкапсуляция, наследование, полиморфизм)
- •58. Основные составляющие объектного подхода: абстрагирование, инкапсуляция, модульность
- •59. Природа объекта. Состояние, поведение, идентичность объекта
- •60. Отношения между объектами. Связи. Агрегация
44. Перехватывание исключений
Объекты исключений перехватываются по типу, для этого используют одно выражение перехвата или их последовательность. Выражение перехвата исключения состоит из трех частей: ключевого слова catch, объявления в круглых скобках для переменной встроенного типа или объекта определенного класса, а также набора операторов в фигурных скобках, которые и выполняют обработку исключения.
В следующем примере показан обработчик с фильтрацией по типу, позволяющий перехватить определенное исключение, в данном случае исключение FileNotFoundException.
catch (FileNotFoundException e)
{
Console.WriteLine("[Data File Missing] {0}", e);
}
45. Спецификация исключений. Обработка неожидаемых исключений.
В определении функции можно указать, исключения какого типа она может выбрасывать. Спецификация исключений для функции выглядит так:
<тип> FuncName(<список параметров>) throw([<тип>
[, <тип> ...]])
{
<тело функции>
}
Тем самым мы сообщается, что функция может выбрасывать только типы, перечисленные в списке после ключевого слова throw. Если этот список пустой, то функция вообще не должна выбрасывать никаких исключений.
Однако то, какие исключения функция прямо или косвенно выбрасывает на самом деле, выясняется только во время выполнения. Компилятор не выдает никаких ошибок или предупреждений на этот счет. Если функция, снабженная спецификацией исключений, выбрасывает непредвиденное, т. е. не указанное в спецификации, исключение, вызывается функция unexpected () . По умолчанию последняя просто вызывает terminate () . Вы можете, тем не менее, указать свою собственную функцию, которая должна активироваться при появлении непредвиденных исключений, вызвав set_unexpected (). Прототип ее находится в файле except.h
typedef void (_RTLENTRY *unexpected_function)();
…
unexpected_function _RTLENTRY set_unexpected(unexpected_function);
Возвращается указатель на предыдущую функцию обработки. Процедура для непредвиденных исключений не должна возвращать управление. Она может либо аварийно завершить программу, либо выбросить исключение.
46. «Раскручивание» стека. Иерархия исключений стандартной библиотеки
Когда функция выбрасывает исключение, то управление передается обработчику исключений. в функцию, которая еще не завершила свою работу. Это происходит потому, что поиск нужного обработчика исключений. проходит по вложенным блокам try, которые могут находится в разных функциях. В стеке хранятся адреса возврата и лок. переменные вызванных, но еще не завершивших свою работу, функций. Механизм обр. искл. реализован таким образом, что если обработчик выброшенного искл. не найден в текущей ф-ции, то все лок. объекты, принадл. этой ф-ции, уничтожаются, т.е. удаляются из стека, а затеем поиск обработчика искл. продолжается в след. ф-ции по иерархии вызовов. При удалении лок. объектов из стека для каждого из них вызывается деструктор. Такой процесс поиска нужного обр. исключений называется раскруткой стека.
Например, следующий класс инкапсулирует выделение памяти для массива целых в конструкторе и ее освобождение в деструкторе:
class PTR {
public:
PTR() { ptr = new int[ chunk ]; }
~PTR { delete[] ptr; }
private:
int *ptr;
};
Локальный объект такого типа создается в функции manip() перед вызовом mathFunc():
void manip( int parm ) {
PTR localPtr;
// ...
mathFunc( parm ); // возбуждает исключение divideByZero
// ...
}
Если mathFunc() возбуждает исключение типа divideByZero, то начинается раскрутка стека.
Иерархия исключений стандартной библиотеки
Вершиной иерархии является класс exceptioh (определенный в заголовочном файле <exception>). В этом классе содержится функция what(), переопределяемая в каждом производном классе для выдачи сообщения об ошибке.
Непосредственными производными классами от класса exception являются классы runtime_error и logic_error ( определенные в заголовочном файле <stdexcept>), имеющие по несколько производных классов.
Производными от exception также являются исключения: bad_alloc, генерируемое оператором new, bad_cast, генерируемое dynamic_cast, и bad_typeid, генерируемое оператором typeid.
Класс logic_error и производные от него классы (invalid_argument, length_error, out_of_range) указывают на логические ошибки (передача неправильного аргумента функции, выход за пределы массива или строки).
Класс runtime_error и производные от него (overflow_error и underflow_error) указывают на математические ошибки переполнения сверху и снизу.