- •1. Объектно-ориентированное программирование (oop). Объектно-ориентированная технология (oot) программирования.
- •2. Свойства оор.
- •3. Объектно-ориентированный подход (ооп). Определение составляющих объектного подхода: ооа, ood, оор.
- •4. Компоненты оор.
- •5. Объект. Основные понятия: определение объекта, его состояние, поведение, индивидуальность. Взаимодействие объектов. Отношения между объектами.
- •6. Класс. Отношения между классами. Классификация. Методы классификации.
- •7. Вопросы качества абстракция и выбора операций при создании классов и объектов.
- •9. Ссылки и параметры-ссылки. Объявления переменных.
- •10. Встраиваемые функции. Операции new и delete.
- •11. Функции-члены и данные-члены.
- •12. Интерфейсы и реализация.
- •13. Конструкторы и инициализация. Конструктор без параметров (по умолчанию). Конструктор копирования.
- •14. Деструкторы и очистка.
- •Статические члены: функции и данные.
- •16. Структуры и объединения.
- •17. Константные члены-функции и константные объекты.
- •18. Дружественные функции и перегрузка операций.
- •19. Перегрузка new, delete.
- •Void *operator new (size_f size);
- •Void operator delete (void *); //void * - указатель на область памяти, //выделяемую под объект
- •20. Преобразование типов, определяемых пользователем с помощью конструкторов и операций преобразования.
- •22. Друзья-функции и друзья-классы
- •24. Производные классы. Базы прямые, непрямые
- •25. Конструкторы, деструкторы и наследование
- •26. Множественное наследование
- •27. Виртуальные базовые классы. Иерархия классов. Виртуальные функции
- •Virtual void draw();
- •Void draw();
- •28. Полиморфизм
- •29. Абстрактные классы и чистые виртуальные функции.
- •30. Заголовочные файлы. Предопределенные объекты и потоки.
- •31. Операции помещения и извлечения. Манипуляторы
- •Int main()
- •33. Конструкторы файловых потоков. Ввод-вывод в файлы.
- •34 Параметризированные типы и функции
- •35 Шаблоны функций. Параметры шаблонов. Шаблоны классов
- •36. Контейнеры. Итераторы
- •37. Использование assert, кодов возврата, сигналов, setjmp и longjmp.
- •38. Объектно-ориентированная обработка исключений. Применение try, catch, throw.
37. Использование assert, кодов возврата, сигналов, setjmp и longjmp.
Диагностика: <assert.h>
Макрос assert используется для включения в программу диагностических сообщений.
void assert (int выражение)
Если выражение имеет значение нуль, то
assert (выражение)
напечатает в stderr сообщение следующего вида:
Assertion failed: выражение, file имя-файла, line nnn
после чего будет вызвана функция abort, которая завершит вычисления. Имя исходного файла и номер строки будут взяты из макросов __FILE__ и __LINE__.
Если в момент включения файла <assert.h> было определено имя NDEBUG, то макрос assert игнорируется.
"Сигнал - программное прерывание, доставляемое процессу". Это сообщение выводит на экран стандартный обработчик сигнала SIGSEGV, входящий в состав библиотеки libc (в Window$ этому отчасти соответствует не менее любимое "Программа выполнила недопустимую операцию и будет закрыта"). Сигнал может быть послан процессу не непосредственно операционной системой, но также и другим процессом, что можно использовать, например, для синхронизации процессов. Посылка сигнала осуществляется системным вызовом kill(). Имеется также одноименная программа kill. Название и системного вызова, и программы не совсем корректно отражает их функциональность; это связано с тем, что часто оба средства используются именно для посылки сигнала SIGKILL, короче, так сложилось исторически. Вообще, когда нужно оправдать как-то ту или иную нелепость, несуразность, нелогичность, фраза "так сложилось исторически" находит широкое (и успешное) применение :-).
Что касается разделения обязанностей между обработчиком сигнала и "главной" программой, то наиболее безопасным с точки зрения возможности написать программу, содержащую очень трудно обнаруживаемые ошибки, является способ "ВСЕ делать в обработчике, а в основной программе просто вызывать pause() или sleep()".
Объявления в <setjmp.h> предоставляют способ отклониться от обычной последовательности "вызов - возврат"; типичная ситуация - необходимость вернуться из "глубоко вложенного" вызова функции на верхний уровень, минуя промежуточные возвраты.
int setjmp(jmp_buf env);
Макрос setjmp сохраняет текущую информацию о вызовах в env для последующего ее использования в longjmp. Возвращает нуль, если возврат осуществляется непосредственно из setjmp, и не нуль, если - от последующего вызоваlongjmp. Обращение к setjmp возможно только в определенных контекстах, в основном это проверки в if, switсh и циклах, причем только в простых выражениях отношения.
if (setjmp() == 0)
/* после прямого возврата */
else
/* после возврата из longjmp */
void longjmp(jmp_buf env, int val);
longjmp восстанавливает информацию, сохраненную в самом последнем вызове setjmp, по информации из env; выполнение программы возобновляется, как если бы функция setjmp только что отработала и вернула ненулевое значение val. Результат будет непредсказуемым, если в момент обращения к longjmp функция, содержащая вызовsetjmp, уже "отработала" и осуществила возврат. Доступные ей объекты имеют те значения, которые они имели в момент обращения к longjmp; setjmp не сохраняет значений.
Сигналы: <signal.h>
Заголовочный файл <signal.h> предоставляет средства для обработки исключительных ситуаций, возникающих во время выполнения программы, таких как прерывание, вызванное внешним источником или ошибкой в вычислениях.
void (*signal(int sig, void (*handler)(int)))(int)
signal устанавливает, как будут обрабатываться последующие сигналы. Если параметр handler имеет значение SIG_DFL, то используется зависимая от реализации "обработка по умолчанию"; если значение handler равно SIG_IGN, то сигнал игнорируется; в остальных случаях будет выполнено обращение к функции, на которую указывает handler с типом сигнала в качестве аргумента. В число допустимых видов сигналов входят:
SIGABRT |
аварийное завершение, например от abort; |
SIGFPE |
арифметическая ошибка: деление на 0 или переполнение; |
SIGILL |
неверный код функции (недопустимая команда); |
SIGINT |
запрос на взаимодействие, например прерывание; |
SIGSEGV |
неверный доступ к памяти, например выход за границы; |
SIGTERM |
требование завершения, посланное в программу. |
signal возвращает предыдущее значение handler в случае специфицированного сигнала, или SIGERR в случае возникновения ошибки.
Когда в дальнейшем появляется сигнал sig, сначала восстанавливается готовность поведения "по умолчанию", после чего вызывается функция, заданная в параметре handler, т.е. как бы выполняется вызов (*handler)(sig). Если функцияhandler вернет управление назад, то вычисления возобновятся с того места, где застал программу пришедший сигнал. Начальное состояние сигналов зависит от реализации.
int raise(int sig)
raise посылает в программу сигнал sig. В случае неудачи возвращает ненулевое значение.
Функция setjmp сохраняет состояние стека, который может быть последовательно восстановлен посредством использования функции longjmp. Функции setjmp и longjmp обеспечивают возможность выполнения нелокального (nonlocal) перехода и обычно используются для передачи управления к обработке ошибок для восстановления кода в ранее вызванной процедуре (без использования обычного вызова), для возврата условных обозначений.