
Void my_terminate()
{
cout<<”program aborted””<<endl;
abort();
}
Int main()
{
set_terminate(my_terminate);
try{
cout<<”generate exception int”<<endl;
throw 1;
}catch(double i)
{
cout << ”exception(double)”<<end;
}
return 0;
}
Функция unexpected()
void unexpected()
Особенности:
вызывается автоматически при попытке сгенерировать исключительную ситуацию, не указанную в разделе throw
по умолчанию вызывает функцию terminate()
можно изменить обработчик функции, используя
unexpected_handler set_unexpected ( unexpected_handler newhandler ) throw ()
Однако он должен заканчиваться вызовом terminate()
2.24
В С++ для поддержки динамического полиморфизма используются :
динамическая идентификация типа RTTI ( run-time type specification ) - позволяет идентифицировать тип объекта при выполнении программы
дополнительные операторы приведения типов - обеспечивают более безопасный способ приведения типов
Динамическая идентификация типа добавлена в связи с неободимостью определения типов объектов при выполнении программы.
Такая ситуация возникает при реализации полиморфизма с помощью иерархий класов, вирутальных функций. указателей на базовые классы.
Оператор typeid.
Для идентификации типа предназначен оператор
typeid ( object );
typeid ( type );
Особенности:
определен в заголовке <typeinfo>
object - объект, для которого выполняется ижентификация типа
type - тип, для которого требуется получить описание
оператор возвращает const type_info& - константную ссылку на объект типа type_info
Класс type_info.
Предназначен для описания типа объекта . Получить объект этого класса можно только с использованием оператора typeid.
2.25
Оператор typeid может применяться к шаблонным классам.
Особенности :
тип объекта определяется также тем, какие данные используются в качестве шаблонных параметров при создании конкретного объекта
если для одного и того же шаблонного класса типы параметров не совпадают, то типы классов считаются разными
#include <iostream>
#include <typeinfo>
using namespace std;
template < class T1, class T2>
class myclass{
T1 a; T2 b;
public:
};
template < class T1, class T2, class T3, class T4>
void compare ( myclass <T1, T2> & c1, myclass <T3, T4> &c2){
if (typeid ( c1 ) == typeid ( c2)) {
cout << " objects have one type " ;
}else {
cout << " object have different types";
}
}
Int main(){
myclass <int, double> o1, o2;
myclass <double, int> o3;
myclass < int, int> o4;
compare (o1, o2);
compare ( o1, o3)
compare( o1, o4);
compare (o2, o3);
compare( o2, o4);
return 0;
}
2.26
Операторы приведения типов.
В С++ существуют следующий операторы приведения типов:
стандартный оператор - ( тип ) выражение
const_cast
reinterpreted_cast
static_cast
dynamic_cast
Оператор const_cast.
const_cast < type > ( expr )
Особенности:
используется для явного замещения модификаторов const ( немодифицируемый объект ) и volatile ( объект может менятся неявно ) для указателей и ссылок
результирующий тип должен совпадать с исходным за исключением const и volatile
НЕЛЬЗЯ напрямую снять модификатор const с переменной
в основном используется для работы с аргументами фукнций
не рекомендуется к использованию ( не безопасен )
expr - исходное выражение
type - результирующий тип
#include < iostream >
using namespace std;