Главная » Просмотр файлов » Материалы (12)

Материалы (12) (1115039), страница 2

Файл №1115039 Материалы (12) (Материалы к лекциям) 2 страницаМатериалы (12) (1115039) страница 22019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

Если доступ ксамому исключению не нужен, то в операторе catch можно указывать только его тип.Существует специальный вид обработчика, перехватывающего любые исключения catch (…){---}. Естественно, он должен находиться в конце последовательности операторовcatch.Если для сгенерированного исключения в текущем try-блоке нет подходящегообработчика, оно перехватывается объемлющим try-блоком (main()f()g()h()).Если же подходящего обработчика так и не удалось найти, может произойтиненормальное завершение программы. При этом вызывается стандартная библиотечнаяфункция terminate (), которая в свою очередь вызывает функцию abort (), чего лучшеизбегать.Перехват исключений.void f (){try {throw E();}catch (H) {// когда мы сюда попадем?}}Обработчик будет вызван:(1) Если H того же типа, что и E.(2) Если H является однозначной открытой базой E.(3) Если Н и Е являются указателями, и (1) или (2) выполняется для типов, на которые ониуказывают.(4) Если H является ссылкой, и (1) или (2) выполняется для типа, на который H ссылается.Пример.class A {public:A () {cout << “Constructor of A\n”;}~A () {cout << “Destructor of A\n”;}};class Error {};class Error_of_A : public Error {};void f () {A a;throw 1;cout << “This message is never printed” << endl;}int main () {try {f ();throw Error_of_A();}catch (int) { cerr << “Catch of int\n”; }catch (Error_of_A) { cerr << “Catch of Error_of_A \n”; }catch (Error) { cerr << “Catch of Error\n”; }return 0;}Результат работы программы на предыдущем слайде.Constructor of ADestructor of A // т.к.

в f обработчика нет, поиск идет дальше,// но при выходе из f вызывается деструктор// локальных объектов.Catch of intЕсли поменять строки внутри try, получим:Catch of Error_of_AЕсли закомментировать строку// catch (Error_of_A) { cerr << “Catch of Error_of_A \n”; },получимCatch of ErrorПример использования классов исключений.class MathEr {...virtual void ErrProcess();...};class Overflow : public Math Er {... void ErrProcess();...};class ZeroDivide : public Math Er {... void ErrProcess();...};...Через параметры конструктора исключения можнопередавать любую нужную информацию.Если использовать виртуальные функции, можно после tryблока задать единственный обработчик catch, имеющийпараметр типа базового класса, но перехватывающий иобрабатывающий любые исключения:try { ...}catch (MathEr & m) {...

m. ErrProcess(); ...}Организованная таким образом обработка исключенийпозволяет легко модифицировать программы.Исключения, генерируемые в функциях.В заголовке функции можно указать типы исключений (через запятую), которые можетгенерировать функция (эту возможность удобно использовать при описании библиотечныхфункций):тип_рез имя_функции (список_арг) [const] throw (список_типов) { ...

}Если список типов пустой, то функция не может генерировать никаких исключений.Если же функция все-таки сгенерировала недекларированное исключение, вызываетсябиблиотечная функция unexpected () работающая аналогично функции terminate().Использование аппарата исключений – единственный безопасный способнейтрализовать ошибки в конструкторах и деструкторах, поскольку они не возвращаютникакого значения, и нет другой возможности отследить результат их работы.Если деструктор, вызванный во время свертки стека, попытается завершить свою работупри помощи исключения, то система вызовет функцию terminate(), что крайненежелательно. Отсюда важное требование к деструктору: ни одно из исключений, котороемогло бы появиться в процессе работы деструктора, не должно покинуть его пределы.Действия, выполняемые с момента генерацииисключения до завершения его обработки. При генерации исключения ( throw X ) создается временный объект – копия X(работает конструктор копирования).

С этой копией будет работать выбранныйдалее обработчик; она существует до тех пор, пока обработка исключения небудет завершена. Для всех других объектов try-блока, созданных к этому моменту, перед выходомиз try-блока освобождается память; при этом для объектов – экземпляров классоввызывается деструктор.

То же делается и для уже созданных подобъектов: членовкласса – объектов другого класса и баз. Этот процесс называют «раскруткой»(«сверткой») стека. Если в списке обработчиков catch этого try-блока найден подходящий, товыполняются его операторы; затем выполнение программы продолжается соператора, расположенного за последним обработчиком этого try-блока. Если в списке данного try-блока не нашлось подходящего обработчика, то поискпродолжается в динамически объемлющих try-блоках (при этом процесс сверткистека продолжается). Если подходящего обработчика так и не нашлось, то вызывается функцияterminate() и выполнение программы прекращается.Шаблоны1. Механизм шаблонов реализует в С++ параметрический полиморфизм.2.

Шаблон представляет собой предварительное описание функции или класса,конкретное представление которых зависит от параметров шаблона.3. Для описания шаблонов используется ключевое слово template, вслед закоторым указываются аргументы (параметры шаблона), заключенные в угловыескобки.4. Параметры шаблона перечисляются через запятую, и могут быть:а) объектами следующих типов:- целочисленного,- перечислимого,- указательного (в том числе указатели на члены класса),- ссылочного;б) именами типов (перед именем типа надо указыватьключевое слово class или typename).5. Параметры-объекты являются константами, их нельзя изменять внутришаблона.Шаблоны функций.template < список_параметров_шаблона >тип_рез-та имя_функции ( список_аргументов_функции ) { /*...*/ }Обращение к функции-шаблону:имя_функции < список_фактич._параметров_шаблона >(список_фактич_аргументов_функции );Пример: функция суммирования элементов массива.template < class T >T sum ( T array[ ], int size ) {T res = 0;for ( int i = 0; i < size; i++ ) res += array[ i ];return res;}Использование данного шаблона для массивов типа int [10] :int iarray [10];int i_sum;//...i_sum = sum < int > ( iarray, 10 );Можно задать аргумент size в виде параметра шаблона:template < class T, int size >T sum ( T array [ ] ) { /* ...

*/ }Тогда вызов sum будет таким:i_sum = sum < int, 10 > ( iarray );Неявное определение параметра-типа шаблонаПример 1.class complex{... public:complex ( double r = 0, double i = 0 );operator double ();......};template < class T >T f ( T& x, T& y ) {return x > y ? x : y;}double f ( double x, double y ){return x > y ? -x : -y;}int main ( ) {complex a ( 2 , 5 ), b ( 2 , 7 ), c;int i, j = 8, k = 10;}c = f ( a , b );// f < complex > (a , b)i = f ( j , k );return 0;// f < int > (j , k)Пример 2.template < class T >T max (T & x, T & y) {return x > y ? x : y;}int main ( ) {double x = 1.5, y = 2.8, z;int i = 5, j = 12, k;char * s1 = "abft";char * s2 = "abxde", * s3;z = max ( x, y );k = max < int > (i, j);// z = max (x, i);z = max < double > ( y, j );s3 = max (s2, s1);return 0;}// max <double>// max <int>// ошибка! - неоднозначный выбор параметров// max < char * >,// но происходит сравнение адресовtemplate <class T> T m1 (T a, T b) {cout << "m1_1\n";return a < b ? b : a;}template <class T, class B> T m1 (T a, T b, B c) {cout << "m1_2\n";c = 0; return a < b ? b : a;}template <class T, class Z> T m1 (T a, Z b) {cout << "m1_3\n";return a < b ? b : a;}int m1 (int a, int b) {cout << "m1_4\n";return a < b ? b : a;}int m1 (int a, double b) {cout << "m1_5\n";return a;}Пример 3.template <class T> T m1 (T a, T b) {cout << "m1_1\n";return a < b ? b : a;}template <class T, class B> T m1 (T a, T b, B c) {cout << "m1_2\n";c = 0; return a < b ? b : a;}template <class T, class Z> T m1 (T a, Z b) {cout << "m1_3\n";return a < b ? b : a;}int m1 (int a, int b) {cout << "m1_4\n";return a < b ? b : a;}int m1 (int a, double b) {cout << "m1_5\n";return a;}int main () {int i;m1 <int> (2, 3);// m1_1m1 <int, int> (2, 3);// m1_3m1 <int> (2, 3, i);// m1_2m1 (1, 1);// m1_4m1 (1.3, 1);// m1_3m1 (1.3, 1.3);// m1_1return 0;}Пример 3.// Если убрать первый шаблон:// m1_3// m1_3// m1_2// m1_4// m1_3// m1_3Алгоритм выбора оптимально отождествляемой функции сучетом шаблонов•Для каждого шаблона, подходящего по набору формальных параметров, осуществляетсяформирование специализации, соответствующей списку фактических параметров.•Если есть два шаблона функции и один из них более специализирован (т.е.

каждый егодопустимый набор фактических параметров также соответствует и второй специализации ),то далее рассматривается только он.•Осуществляется поиск оптимально отождествляемой функции из полученного наборафункций, включая определения обычных функций, подходящие по количеству параметров.При этом если параметры некоторого шаблона функции были определены путемвыведения по типам фактических параметров вызова функции, то при дальнейшем поискеоптимально отождествляемой функции к параметрам данной специализации шаблонанельзя применять никаких описанных выше преобразований, кроме преобразованийТочного отождествления.•Если обычная функция и специализация подходят одинаково хорошо, то выбираетсяобычная функция.•Если полученное множество подходящих вариантов состоит из одной функции, то вызовразрешим.

Характеристики

Тип файла
PDF-файл
Размер
235,49 Kb
Тип материала
Высшее учебное заведение

Список файлов учебной работы

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6367
Авторов
на СтудИзбе
309
Средний доход
с одного платного файла
Обучение Подробнее