
- •1. Объявление класса. Примеры. Понятие инкапсуляции, полиформизма, наследования.
- •2. Доступ к членам класса. Управление доступом к членам класса. Указатель this. Примеры.
- •3. Конструкторы и деструкторы. Параметризованные конструкторы. Примеры.
- •4. Дружественные ф-ции. Примеры.
- •5. Перегрузка функций. Значение аргументов ф-ции по умолчанию. Примеры.
- •6. Наследование. Примеры.
- •7. Передача объектов в ф-ции и возврат объекта из ф-ции. Массивы объектов. Примеры.
- •8. Перегрузка операторов при помощи функций-членов класса. Примеры.
- •9. Перегрузка операторов при помощи дружественных ф-ций. Примеры.
- •10. Ссылки, ссылки на объекты. Примеры.
- •11. Конструктор копирования. Примеры
- •12. Наследование и спецификаторы доступа. Примеры.
- •13. Конструкторы и деструкторы производных классов. Примеры.
- •14. Указатели и ссылки на производные типы. Примеры.
- •Ссылки на производные классы
- •15. Виртуальные ф-ции. Примеры.
- •16. Чисто виртуальные ф-ции и абстрактные классы. Примеры.
- •17. Обработка исключений. Примеры.
- •18. Создание собственных операторов вставки и извлечения. Примеры.
- •19. Файловый ввод-вывод. Примеры.
- •20. Формирование ввода-вывода. Примеры.
- •21. Двоичные файлы. Примеры.
- •22. Произвольный доступ. Примеры.
- •23. Ввод-вывод в массивы Примеры.
- •24. Класс string. Примеры.
- •25. Функции-шаблоны. Примеры.
- •Явная перегрузка функций-шаблонов
- •26. Классы-шаблоны. Примеры.
- •27. Пространства имён. Примеры.
- •28. Статические члены класса. Примеры.
- •30. Идентификация типа во время исполнения. Примеры.
- •31. Новые операторы приведения типов. Примеры.
- •32. Контейнерные классы. Примеры.
17. Обработка исключений. Примеры.
Исключения, или исключительные ситуации, - это ошибки, которые возникают во время работы программы. Исключение генерируется в результате нестандартных ситуаций, возникающих при выполнении программ. С помощью исключений можно передавать управление от одной части программы к другой.
Наиболее часто встречаются следующие исключения:
нехватка памяти,
выход индекса за границы массива,
арифметическое переполнение,
деление на нуль,
недопустимые параметры функций.
Обработка исключений не предназначена для реакции на внешние события, такие как щелчок мыши, завершение дисковых операций ввода/вывода и т.д., которые лучше взаимодействуют со средствами обработки прерываний.
Синтаксис операторов обработки исключений:
try { // блок try }
catch (type1 arg) { // блок catch }
catch (type2 arg) { // блок catch }
catch (type3 arg) { // блок catch }
. . .
catch (typeN arg) { // блок catch }
Обработка исключительных ситуаций состоит из трех этапов:
генерация исключения,
перехват исключения обработчиком исключений,
использование блока try.
Оператор генерации исключений фактически выполняет переход на блок, осуществляющий перехват и обработку исключений. Операторы программы, во время выполнения которых необходимо обеспечить обработку исключительных ситуаций, располагаются в блоке try. Если исключительная ситуация (ошибка) имеет место внутри блока try, она генерируется с помощью ключевого слова throw. Перехват и обработка исключений происходит в блоке catch. Ключевое слово catch служит меткой, обозначающей точку в программе, в которую передается управление в случае перехвата исключения.
Если с блоком try связано более одного оператора catch, то использование конкретного оператора зависит от типа исключительной ситуации. Если тип данных, указанный в операторе catch, соответствует типу исключительной ситуации, то выполняется данный оператор catch, а все другие операторы блока try пропускаются. Если исключение перехвачено, аргумент arg получает его значение. Можно перехватывать любые типы данных, в том числе и классы.
Синтаксис оператора throw:
throw исключительная_ситуация;
При генерации исключительной ситуации, для которой нет соответствующего оператора catch, происходит аварийное завершение программы.
18. Создание собственных операторов вставки и извлечения. Примеры.
Создание операторов вставки
В С++ имеется лёгкий способ определения оператора вставки для создаваемых классов.
Общая форма функции вставки
ostream &operator<<(ostream &поток, тип_класса объект)
{
// характерный для типа код
return поток;
}
Обратим внимание на необходимость возвращать поток. Также является приемлимым и, более того, является общей практикой использовать в качестве параметра объект ссылку, а не сам объект. Во-первых, если объект является большим, то гораздо быстрее передать его адрес. Во-вторых, это предотвращает вызов деструктора объекта, когда функция возвращает результат.
В программе-примере перегруженная функция вставки не является членом класса three_d. Действительно, ни функция вставки, ни функция извлечения не могут быть членами класса. При перегрузке оператора вставки левым аргументом является поток, а правым аргументом – объект класса. Поэтому перегруженные операторы вставки не могут быть функциями-членами. Чтобы получить доступ к частным и защищённым
членам класса оператор вставки должен быть другом класса. В качестве друга класса, для которого он определён, он имеет доступ к частным данным.
Пример
#include <iostream>
using namespace std;
class three_d {
int x, y, z;
public: three_d(int a, int b, int c){ x=a; y=b; z=c; }
friend ostream &operator<<(ostream &stream, three_d obj);};
// вывод координат x, y, z (оператор вставки для three_d)
ostream &operator<<(ostream &stream, three_d obj)
{
stream << obj.x << ", ";
stream << obj.y << ", ";
stream << obj.z << "\n";
return stream;
}
int main()
{
three_d a(1,2,3), b(3,4,5), c(5,6,7);
cout << a << b << c;
return 0;
}
Перегрузка операторов извлечения
Для того, чтобы перегрузить оператор извлечения, используется тот же самый общий подход, что и для перегрузки операторов вставки.
Общая форма экстрактора имеет вид:
istream &operator>>(istream &поток, тип_класса &obj)
{
// код экстрактора
return поток;
}