- •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
Unexpected_function set_unexpected(unexpected_function func_name);
Параметром в эту функцию необходимо передать указатель на новую функцию, при этом указатель на старую функцию будет возвращен в качестве результата. Сам указатель имеет стандартный тип unexpected_function:
Typedef void (* unexpected_function) ();
и описан в заголовочном файле except.h.
Новая функция unexpected может вызывать другие функции, например, abort, exit и terminate.
Чтобы определить наличие необработанного исключения, стандарт вводит специальную функцию uncaught_exception41. Эта функция не имеет параметров. Возвращаемое значение имеет тип bool. При наличии необработанного исключения функция возвращает значение true, при отсутствии false.
В С++ для поддержки механизма исключений есть целая иерархия классов исключений. Ее базовым классом является класс std::exception, имеющий следующее определение (его мы даем в максимально упрощенном виде):
class exception {
public:
exception () throw();
exception (const exception&) throw();
exception& operator= (const exception&) throw();
virtual ~exception () throw();
virtual const char* what () const throw();
};
Класс exception имеет два основных подкласса, а именно logic_error и runtime_error. От них, в свою очередь, образуются специальные классы исключений: domain_error, invalid_argument, length_error, out_of_range (от logic_error) и range_error, overflow_error, underflow_error (от runtime_error). Кроме перечисленных классов определены следующие стандартные классы исключений: bad_alloc (связан с ошибками при выделении динамической памяти); bad_cast (используется при ошибках операций преобразования типов); bad_typeid (служит для представления ошибок идентификации типов); bad_exception (применяется для повторно генерируемых исключений).
Использование иерархии классов позволяет более точно классифицировать причины возникновения исключений и осуществлять выборочную обработку. Исключения базовых классов включают в себя все исключения производных классов, например, исключение domain_error есть частный случай logic_error, которое, в свою очередь, есть частный случай exception. Добавляя к иерархии новые классы, можно получать новые частные случаи исключений. Единственное, о чем следует помнить, – исключения более общих классов должны «отлавливаться» после частных исключений, иначе все частные случаи исключений будут обрабатываться по общему «сценарию».
Для дополнительной поддержки механизма исключений в заголовочном файле except.h имеются также внешние переменные __throwExceptionName, __throwFileName, __throwLineNumber:
Extern char * __throwExceptionName; extern char * __throwFileName; extern unsigned __throwLineNumber;
__throwExceptionName содержит имя типа последнего исключения, порожденного программой; __throwFileName хранит имя файла с исходным текстом программы, в котором возникло последнее исключение, а __throwLineNumber инициализируется номером строки в исходном файле, где было сгенерировано исключение.
Вопросы для самопроверки
Что понимается под исключительной ситуацией в С++?
Чем отличается механизм исключений от традиционного механизма обработки ошибок (который используется, например, в языке С)?
Как заключить группу операторов в контролируемый блок? Приведите пример.
Каким образом записывается декларация типа исключения в заголовке блока catch? Дайте общий формат и пример.
Опишите процесс генерации и передачи исключения в обработчик.
Что понимается под развязкой стека?
Как осуществляется ретрансляция сгенерированного исключения?
Какова продолжительность существования объекта-исключения?
Почему захват исключения по ссылке представляется наиболее эффективным? Обоснуйте ответ.
Почему обработчик исключения catch(...) должен всегда быть последним в цепочке обработчиков?
Каково назначение спецификации исключений в функциях?
Приведите примеры определения (описания) глобальной и компонентной функций со спецификацией исключений.
Охарактеризуйте свойства функции со спецификацией исключений вида throw().
Имеется функция void f() throw(). Можно ли в ней вызвать функцию с заголовком вида void g() throw(CSomeException)? Поясните ответ.
Имеется класс C и производный от него класс D. В первом классе есть функция с заголовком virtual bool C::f() throw(), а во втором – функция с заголовком bool D::f() throw(CSomeException). Правильно ли описаны эти функции? Обоснуйте ответ.
Каковы последствия нарушения спецификации исключений в функциях?
Каково назначение функций terminate и abort?
Каким образом задать пользовательскую функцию вместо terminate? Приведите фрагмент кода.
Перечислите случаи, когда происходит автоматический вызов функции terminate.
Для чего нужна функция unexpected?
Как можно заменить функцию unexpected собственной функцией? Запишите фрагмент кода.
Как определить наличие в текущей точке программного кода необработанного исключения?
Какие классы исключений имеются в стандартной библиотеке С++?
Охарактеризуйте назначение класса std::bad_exception.
Определите собственный класс исключений и покажите его использование на примере.
Почему исключения в конструкторах и деструкторах наиболее опасны? Дайте обоснованный ответ.
Задачи
Перепишите шаблоны задач 2 и 3 из главы 5 так, чтобы работа с ними была максимально безопасна, используя механизм исключений. Покажите использование новых шаблонов в штатном режиме и при наличии исключений. Оцените издержки, вносимые механизмом исключений.