
- •Int main()
- •Int main()
- •Int main()
- •Int main()
- •Int main()
- •Int main()
- •Int main()
- •Int main ()
- •Int main()
- •Int main()
- •Int main()
- •Int main(){
- •Int main(){
- •Int main(){
- •Int main(){
- •Int main(){
- •Int main(){
- •Int main(){
- •Int main(){
- •Int main(){
- •Int main(){
- •Int main(){
- •Int main(){
- •Int main(){
Int main(){
Int a; cin>>a;
Try{ f(a);} catch (int){f(1)} return 0;
}
В рамках С++ строгая спецификация исключений в компиляторах не реализована. Если для функции или метода не задана конструкция спецификации исключений, тогда предполагается, что могут генерироваться любые исключения.
Void fun() throw(){
Try{throw ”Error”;} catch (char *){}
}
Такая функция не может выбрасывать вовне исключения.
Java
Throwable – классы, производные от этого могут выкидывать исключения.
Все классы, производные от RuntimeException и Error, включая сами эти классы называют необъявленными или непроверяемыми (unchecked). А остальные классы, производные от Exception – проверяемые (объявляемые) исключения.
Все объявляемые исключения, выбрасываемые методом в Java должны быть указаны в конструкции спецификации исключений. Это контролируется компилятором.
Необъявляемые могут быть выброшены где угодно.
Java и C# позволяют обеспечить не только обработку, но и завершение.
Обработка и завершение в Java и C#
Try{
Try{ obj f();} finally {}
…
} catch (Exception x){}
Finally может быть только 1. Если он есть, catch может и не быть.
Finally содержит код, который должен выполняться независимо от того, произошло ли исключение в блоке try или нет. При этом finally не обрабатывает исключения, потому если есть try и finally но без catch, то исключение пойдет в более высоко расположенный catch.
С++
<exception>
Bad_alloc – генерируется операцией new.
New A[size];
Возвращает исключение.
New (nothrown) A[size]; - операция new старого типа, возвращает не исключение, а nil.
Параметрический полиморфизм
С++
Generics – шаблоны функций или классов.
Шаблоны функций в С++
Int max(int a, int b);
Double max(double a, double b);
На оба варианта действия такие: return a>b?a:b;
Template <typename T, [typename P …]> //template <class T> - устаревшая форма
T max (T a, Tb){ return a>b?a:b;}
Int main(){
Int x=5, y=10, z;
Z=max(x,y);
}
По шаблону будет сгенерирована функция под тип int.
С++ позволяет объявлять шаблон и несколько функций с одним именем.
Char * max (char * s1, char * s2){
If (stromp(s1, s2)>0) return s1;
Return s2;
}
Прежде компилятор ищет подходящую функцию (специализированную), но если не находит её, использует шаблон. Можно создавать и специализированные шаблоны.
Template <>
Int * max (int *a, int *b){ return a;}
Старая форма такого шаблона: template <int *> …
Алгоритм выбора функции или шаблона
Ищется специализированная функция, которую можно вызвать не проводя преобразование типов аргументов. Если её нет:
Ищется специализированный шаблон. Если его нет:
Компилятор пытается использовать обычный шаблон. При использовании шаблона приведение типов не выполняется.
Если шаблон не подходит, ищется специализированная функция, которую можно вызвать, сделав допустимое приведение типов аргументов.
Пример
Double max (double a, double b){ return a>b?a:b;}
Template <> int* max (int *a, int *b){return a;}
Template <typename T>
T max (T a, T b){return a>b?a:b;}
Double d1 = 1.2, d2=1.3, d3;
…
D3 = max (d1, 100); //выполнится 4-й пункт
Шаблон в С++ - перегрузки функций
Ограничения:
Надо разные типы аргументов.
Template <typename T>
T f(){return T();} //Конструкция нулевой инициализации (в шаблоне).
Если параметр Т заменится именем класса, тогда нулевая инициализация – вызов конструктора без аргументов для этого класса.
Если параметр замещается примитивным типом, тогда нулевая инициализация – нулевое значение соответствующего примитивного типа.