- •6Vpj7-h3cxh-hbtpt-x4t74-3yvy7
- •Оглавление
- •Предисловие
- •Введение
- •1.1. Понятие класса и объекта. Инкапсуляция
- •1.2. Определение классов. Компоненты. Доступность
- •Class_key /*class_id*/ { /*members_list*/ };
- •Value_type class_id::function_id(parameters) {statements}
- •CPoint point1(100,70); // локальный объект
- •Static cPoint point3(50,120); // статический объект
- •Class_id(parameters) /*:initializer_list*/ {/*statements*/}
- •CString(const char *);
- •Delete[] __thematrix;
- •1.4. Обращение к компонентам объектов
- •1.5. Статические и нестатические компоненты классов
- •1.7. Указатель this
- •В опросы для самопроверки
- •2. Механизм наследования. Полиморфизм
- •2.1. Формы наследования. Базовые и производные классы
- •Class_key class_id: inheritance_specifier base_class_id {member_list};
- •2.3. Абстрактные классы
- •2.4. Множественное наследование и виртуальные классы
- •2.5. Преобразование динамических типов. Динамическая идентификация типов
- •Catch ( std::bad_cast & ) { // обработка исключения
- •Return 0;
- •Вопросы для самопроверки
- •3. Дружественные функции и классы
- •3.1. Дружественные функции
- •3.2. Дружественные классы
- •Вопросы для самопроверки
- •4. Механизм вложения
- •4.1. Вложенные классы
- •4.2. Локальные классы
- •Вопросы для самопроверки
- •5. Объектная модель и шаблоны
- •5.1. Определение, описание и инстанцирование шаблонов
- •::Function_id(function_parameter_list) { statements }
- •5.2. Параметры и аргументы шаблонов
- •Class identifier typename identifier
- •// Key, Data – параметры-типы (типы ключа и данных отображения)
- •// Container – контейнер, где содержится информация отображения class сMap {
- •Class MyTemplate
- •Int array[10]; struct Structure { int m; static int sm; } str;
- •5.3. Шаблоны компонентных функций
- •Value_type function_template_id(function_parameter_list) { statements }
- •::Function_template_id(function_parameter_list) { statements }
- •5.4. Специализация шаблонов
- •Вопросы для самопроверки
- •6. Перегрузка операций
- •Value_type operator @ (parameter_list);
- •Value_type operator @ (parameter_list) { statements }
- •Return fail();
- •6.3. Перегрузка бинарных операций
- •Value_type operator @ (parameter); // компонентная функция
- •Value_type operator @ (parameter, parameter); // глобальная функция friend value_type operator @ (parameter, parameter); // дружественная функция
- •Return *this;
- •Return *this;
- •/* Присваиваем собственные данные класса d */
- •6.4. Перегрузка операций управления памятью
- •Typedef void (*new_handler) ();
- •Extern new_handler set_new_handler( new_handler new_p );
- •Void operator delete(void * memory) {
- •... // Специальная обработка пользователя ::operator delete(memory); // освободить память
- •Вопросы для самопроверки
- •7. Механизм исключений
- •Throw expression
- •7.3. Специальные средства поддержки механизма исключений
- •Unexpected_function set_unexpected(unexpected_function func_name);
- •Typedef void (* unexpected_function) ();
- •Extern char * __throwExceptionName; extern char * __throwFileName; extern unsigned __throwLineNumber;
- •Вопросы для самопроверки
- •8. Подсчет ссылок
- •8.1. Назначение механизма подсчета ссылок
- •8.2. Контекстно-независимая модель счетчика ссылок
- •8.4. Внедрение подсчета ссылок в существующий класс
- •Вопросы для самопроверки
- •9. Стандартная библиотека шаблонов (stl)
- •9.1. Назначение и архитектура stl
- •9.2. Последовательные контейнеры
- •Class vector {
- •// Определение итераторов
- •Sort(first,last); // сортировка вектора в диапазоне итераторов
- •Ifstream ifile ("example.In"); ofstream ofile ("example.Out");
- •OutputIterator copy(
- •InputIterator first, InputIterator last, OutputIterator result );
- •// Заполнение списка
- •Operator- (int)
- •Operator- (random access iterator) operator[] (int)
- •InputIterator find(InputIterator first, InputIterator last, const t & value);
- •InputIterator find(InputIterator first, InputIterator last, const t & value)
- •Return first;
- •OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
- •Return result;
- •OutputIterator transform (InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op)
- •Return result;
- •Void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
- •__Quick_sort_loop(first, last, comp); __final_insertion_sort(first, last, comp);
- •T accumulate(InputIterator first, InputIterator last, t init, Function f);
- •V.Push_back(2); V.Push_back(5);
- •9.5. Функторы
- •T operator()(const t & X) const { return -X; }
- •9.7. Адаптеры
- •S1.Push(1); s1.Push(5);
- •// Записать в вектор числа 1 2 3 4
- •// Сортировать по неубыванию
- •// Записать в вектор числа 4 6 10 3 13 2
- •Вопросы для самопроверки
- •Заключение
- •Библиографический Список
- •6Vpj7-h3cxh-hbtpt-x4t74-3yvy7
Throw expression
где expression – выражение, которое определяет тип генерируемого исключения и способ его передачи в блок обработки.
При выполнении оператора throw формируется временный объект-исключение того типа, который определен выражением expression, и этот объект передается («выбрасывается») за пределы контролируемого блока (в контекст, окружающий этот блок). Этот объект поступает в подходящий блок обработки и инициализирует объект, объявленный в заголовке catch. Существование временного объекта ограничивается моментами возбуждения исключения и завершения обработки (штатным или аварийным способом).
Механизм обработки исключений допускает многократное вложение контролируемых блоков. Если исключение не может быть обработано на текущем уровне обработчиков, то оно может быть передано (ретранслировано) на более высокий уровень. Для этой цели используется оператор throw без выражения генерации исключения. Этот оператор вызывает повторную генерацию уже существующего исключения. Например:
try { // контролируемый блок
DataObject.AllocateMemory();
InputStream >> DataObject;
DataObject.Process();
OutputStream << DataObject;
}
catch(CIOException &) // обработчик исключений CIOException
{ ... }
catch(...) // обработчик остальных исключений
{
cerr << endl << “Такие исключения обрабатывать не могу”;
throw;
}
При наличии оператора throw; в блоке обработки временный объект-исключение не разрушается после выхода из текущего обработчика, а передается на следующий уровень обработчиков.
Процесс передачи объекта-исключения в точку обработки сопровождается так называемой «развязкой» стека. Ее цель – удаление всех объектов, локальных по отношению к контексту контролируемого блока, где возникло исключение, а также очистка стековых окон всех функций, вызванных в этом контексте. В ходе развязки стека осуществляется уничтожение всех локальных объектов. Для этого механизм исключений предусматривает автоматический вызов их деструкторов. При этом также удаляются все вложенные в них объекты39.
7.2. Спецификации исключений
При разработке функций в С++ программист может явно указывать, какие типы исключений потенциально генерирует каждая функция. В результате появляется возможность более жесткого контроля исключений и упорядочения их генерации и обработки. Чтобы оформить спецификацию, определение функции дополняется фразой throw40:
throw(type1, type2, ..., typeN)
которая перечисляет типы всех исключений type1, type2, ..., typeN, которые могут возбуждаться этой функцией явно или косвенно. Если функция вообще не должна генерировать исключений, то ее определение дополняется фразой: throw()
Пример
void f1(int) throw(); // исключений не ожидается
int f2(double, char*) throw(const char *);
// только исключения типа const char *
double f3(void) throw(int, char, A);
// исключения встроенных типов int, char и пользовательского типа A
Если некоторая функция генерирует исключение, которое от нее не ожидается, то по умолчанию управление передается из этой функции специальной библиотечной функции unexpected, выполнение которой заканчивается вызовом функции abort. Программа аварийно завершается. Если исключения непредусмотренных типов порождаются функциями, которые вызываются из данной функции, то их обработку должна реализовать сама данная функция. В противном случае исключение выходит за пределы функции и считается неопределенным. Это, в свою очередь, опять ведет к вызову функции unexpected.
