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

31. Понятие манипулятора. Реализация пользовательских манипуляторов.

Чтобы избавить программиста от необходимости иметь дело с состоянием потока посредством флагов, стандартная библиотека предоставляет набор функций дял манипулирования этим состоянием. Ключевая идея заключается в том чтобы вставлять между объектами операцию, которая изменила бы состояние потока. Программист может добавлять собственные манипуляторы написанные в том же стиле что и стандартные.

Например:

#include <iostream.h>

#include <iomanip.h>

ostream& left10(ostream &stream)

{

stream.setf(ios::left);

stream<<setw(10);

return stream;

}

int main()

{

cout << 12 << left10 << 15 << 17 <<endl;

return 0; }

}

32. Файлы последовательного доступа и произвольного доступа.

Произвольный доступ означает, что вы можете перейти непосредственно к определенному месту файла для чтения или внесения изменений в данные, расположенные именно в этом месте. Перемещение указателя файла в заданную позицию выполняет функция fseek(). Если за ней следует, например, функция fread(), то она будет читать данные, начиная с позиции, отмеченной файловым указателем. Кроме того, функция ftell() сообщает текущее положение указателя, а функция rewind() переносит указатель в начало файла.

Последовательный доступ означает, что чтение файла осуществляется сначала.

33. Понятие шаблона. Шаблоны функций и классов.

Шаблоны обеспечивают непосредственную поддержку обобщенного программирования, то есть программирования с использованием типов в качестве параметров. Механизм шаблонов в С++ допускает использование типа в качестве параметра при определении класса или функции. Шаблон зависит только от тех свойств параметра-типа, которые он явно использует, и не требует, чтобы различные типы, используемые в качетсве аргументов, были связаны каким-либо другим образом.

Для большинства людей наиболее очевидным применением шаблонов является определение и использование классов-контейнеров, таких как basic_string , vector, map. Сразу же возникает потребность в шаблонах функций Шаблоны функций имеют большое значение при написании обобщенных алгоритмов , применимых к широкому спектру контейнеров. Существенным моментом является возможность выведения типа аргументов шаблона функции по типам аргументов при ее вызове. Создание производного шаблона класса от класса , не являющегося шаблоном , явялется способом обеспечения общей реализации для набора шаблонов. Часто бывает полезно создавать шаблоны производные от другого шаблона. Базовый класс в этом случае является строительным блоком для реализации дальнейших классов. Если данные или операции в базовом классе зависят от параметров шаблона производного класса, сам базовый класс далжен быть параметризован.

34. Основы обработки исключений в С++. Генерация исключений.

Фундаментальная идея исклчюения состоит в том что функция обнаружившая проблему, но не знающая как ее решить, генерирует исклчюение в надежде, что вызвавшая ее функция сможет решить возникщую проблему. Механизм исключений предназначен для обработки только синхронных исключений, таких как выход за пределы диапазона в массиве ошибок ввода/вывода. Механизмы обработки исключения С++ предназначены для генерации сообщения об ошибке и обработки ошибок и исключительных событий.

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

Рассмотрим тривиальный пример обработки исключительных ситуаций.

Есть функция div(), возвращающая частное от деления чисел, принимаемых в качестве аргументов, если делитель равен нулю, то генерируется исключительная ситуация.

#include<iostream.h>

double div(double dividend, double divisor)

{

if(divisor==0)

throw 1;

return dividend/divisor;

}

void main()

{

double result;

try{

result=div(77.,0.);

cout<<"Answer is "<<result<<endl;

}

catch(int){

cout<<"Division by zero"<<endl;

}

}