Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTVETY_K_EKZAMENU_PO_OOP.doc
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
239.62 Кб
Скачать

31. Перегрузка операций. Перегрузка унарных операторов.

Проилюстрируем перегрузку унарного оператора «-», кот будет создавать копию объекта типа intarray, в котором все эл-ты масива поменяют свой знак. intarray operator-() {intarray t=intarray(*this);for(int i=0; i<fcount; i++) t.fitems[i]=-fitems[i]; return t;}; Здесь сразу виден зачастую неизбежный недостаток перегрузки операторов - падение производительности. В приведеном примере необходимо создать новый объект t, что потребует дополнительных ресурсов, а затем (при выходе из области времени) отработает еще и деструктор при освобождении памяти объекта t. Перегрузка операторов присваивания и индексирования. Исп-ние указателей - членов класса может привести к утечке памяти при обычном присваивании. Поэтому при разработке класса необходимо обязательное исп-ние перегруженого оператора присваивания. Для класса с именем х оператор вида х& operator= (const x &) назется конст-ром присваивания. 0тметим, что операции присваивания (всегда) и индексирования (обычно) исп-ются для получения именующих выражений (адреса переменой). Имено поэтому они должны объявляться как ссылки на соответствующий тип. 0тметим, что у вирт-ого оператора невозможно менять список формальных парамов и обойтись без определения фактического типа объекта а невозможно. Др пример перегрузки оператора присваивания служит для задания всем эл-там масива одинакового значения: intarray& operator=(const int &a) {for (int i=0; i<fcount; i++) fitems[i]=a; return *this;}; Наиболее общий прототип перегружаемого оператора индексирования имеет вид: тип& operator[] (перечислимый тип). Пример реализации перегружаемого оператора индексирования: int& operator[](const int index) {if (index>=0&&index<fcount) return fitems[index]; else throw "Illegal index";}; Здесь использован оператор возбуждения исключения, кот используется сигнализации о возникновении непредвиденой ситуации.

32. Перегрузка операций. Перегрузка бинарных операторов.

Если двухместный оператор перегружается с помощью функции - члена класса, то в качестве своего первого аргумента он получает неявно переданую переменую класса, а второго - единственый из списка аргументов. Пример перегрузки операции сложения: intarray intarray::operator+(const intarray &a) intarray t(*this); int fmin=feount<a.fcount?fcount:a.fcount; for (int i=0; i<fmin; i++) t.fitems[i]+=a.fitems[i]; return t; Перегрузка операторов с помощью друж-веных функций: при объявлении friend-функции в списке парамов определяют все арг-ты (для бинарных операторов - оба). Пример перегрузки операции вычитания с помощью друж-вен функции: 0бъявление в класе friend intarray operator-(const intarray &a, const intarray &b); Реализация: intarray operator-(const intarray &a, const intarray &b); intarray t(a); int fmin=t.fcount<b.fcount? t.fcount:b.fcount; for (int i=0; i<?min; i++) t.fitems[i]-=b.fitems[i]; return t;

33. Исключения и их обработка.

Во время своей работы прога иногда сталкивается с нештатными ситуациями. Напр, деление на ноль. Необходим некот механизм обнаружения и обработки нештатных ситуаций. Когда прога конструируется из раздельных модулей и когда эти модули находятся в независимо разработаных библиотеках, обработка ошибок должна быть разделена на две части: 1) генерация информации о возникновении ошибочной ситуации, кот не может быть разрешена локально; 2) обработка ошибок, обнаруженых в др местах. Идея понятия исключения: функция, обнаружившая проблему, но не знающая, как ее решать, возбуждает (throw, raise) исключение в надежде, что вызвавшая ее функция (прямо или косвено) может решить проблему. В функции, кот хочет решать проблемы даного типа, можно указать, что она перехватывает (catch) такие исключения. Др метод: при обнаружении проблемы, кот не может быть решена локально, прога может: a) прекратить выполнение, b) возвратить специальное «ошибочное» значение, c) возвратить какое-то допустимое значение и оставить прогу в ненормальном состоянии,d) вызвать функцию, предназначеную для обработки ошибки. Механизм обработки исключений предоставляет альтернативу традиционым методам. 0н позволяет отделить код обработки ошибок от собственого кода алгоритма, делая прогу таким образом более понятной. В рез-те получаем более регулярный способ обработки ошибок, что упрощает взаимодействие между отдельно написаными фрагментами проги. Механизм обработки исключений дает способ передачи управления из точки выполнения проги в расположеную выше по управлению точку, в кот определен обработчик исключения (exception handler). 0бработчик исключения будет вызван только в случае исполнения выражения-возбуждения-исключения внутри так наземого блока-с-контролем или в функциях, вызваных из этого блока. В C++ синтаксис возбуждения исключения: throw выражениеорt. Выражение-возбуждения- исключения назют точкой возникновения (возбуждения) исключения (throw-point).