- •Оглавление
- •1. Спецификация const для данных. Назначение.
- •2. Спецификация inline для функций. Назначение.
- •4. Ссылки. Назначение, обращение к данным по ссылке, использование ссылок для параметров функции и возвращаемого значения.
- •5. Динамическое создание и уничтожение объектов. Можно ли операции new и delete использовать вместе с malloc и free?
- •6. Динамическое создание и уничтожение массивов объектов.
- •8. Использование операции :: для доступа к элементам класса и глобальным функциям и переменным
- •9. Спецификации const для методов, не изменяющих объект. Спецификация mutable для элементов данных.
- •10. Дружественные функции и классы.
- •11. Статические переменные класса. Определение и инициализация.
- •12. Статические методы класса.
- •13. Указатель this. Назначение.
- •14. Конструктор: назначение, объявление (синтаксис), момент выполнения.
- •15. Конструктор: инициализация базовых классов и данных объекта через список инициализации в конструкторе.
- •16. Конструктор по умолчанию: объявление (синтаксис), назначение.
- •17. Конструктор копий: объявление (синтаксис), назначение.
- •18. Деструктор: назначение, объявление (синтаксис), момент выполнения.
- •19. Констукторы-преобразователи и операции для преобразования, способ вызова. Спецификация explicit для конструкторов-преобразователей.
- •20. Шаблоны функций: определение (синтаксис), назначение. Как вызвать функцию-шаблон?
- •21. Шаблоны классов (параметризация): определение (синтаксис), назначение. Как создать объект шаблонного класса?
- •22. Специализация шаблонов.
- •23. Библиотека stl. Общая характеристика.
- •24. Перегрузка функций и методов, основные правила связывания.
- •25. Правила перегрузки операций
- •26. Формат перегрузки унарных и бинарных операций как методов и [дружественных] функций.
- •28. Перегрузка операций присваивания: назначение, объявление (синтаксис), действия выполняемые в методе.
- •29. Перегрузка операций [] и () : назначение, объявление (синтаксис).
- •31. Перегрузка операций new и delete в классе: назначение, объявление (синтаксис).
- •32. Исключительные ситуации: назначение и стандартные искл. Ситуации (кроме stl).
- •33. Исключительные ситуации: порождение и перехват (синтаксис).
- •34. Исключительные ситуации: спецификация порождаемых исключительных ситуаций в заголовке функции.
- •36. Чисто виртуальные функции и абстрактные классы.
- •37. Простое наследование: определение, синтаксис. Порядок выполнения конструкторов и деструкторов. Вызов методов, переопределенных в производном классе, из базового класса.
- •39. Операция typeid. Rtti.
- •40. Операция безопасного преобразования данных const_cast. Назначение, синтаксис вызова.
- •41. Операция безопасного преобразования данных static_cast. Назначение, синтаксис вызова.
- •42.Операция безопасного преобразования данных dynamic_cast. Назначение, синтаксис вызова.
- •43. Операция безопасного преобразования данных reinterpret_cast. Назначение, синтаксис вызова.
- •44. Пространства имен: назначение, определение (синтаксис), варианты использования имен из namespace в своей программе.
- •45. Какие методы должны быть определены в классе с динамическим выделением памяти для некоторых элементов данных?
- •46. Сложность программного обеспечения.
- •47. Пять свойств сложной системы.
- •48. Основные методы при создании сложных систем.
- •49. Основные положения оо подхода.
- •50. Концепции оо подхода: Абстрагирование.
- •51. Концепции оо подхода: Ограничение доступа.
- •52. Концепции оо подхода: Модульность
- •53. Концепции оо подхода: Иерархия.
- •54. Концепции оо подхода: Типизация.
- •55. Концепции оо подхода: Параллелизм.
- •56. Концепции оо подхода: Устойчивость (сохраняемость).
- •57. Объекты в ооп: Определение объекта.
- •58. Объекты в ооп: Состояние.
- •59. Объекты в ооп: Поведение. Операции.
- •60. Объекты в ооп: Уникальность (идентичность).
- •61. Объекты в ооп: Отношения между объектами.
- •62. Классы в ооп: Понятие класса, связь между объектами и классами.
- •63. Отношения между классами: Ассоциации.
- •64. Отношения между классами: Наследование.
- •65. Отношения между классами: Агрегация.
- •66. Отношения между классами: Использование.
- •67. Отношения между классами: Конкретизация (параметризованные классы).
- •68. Отношения между классами: Метаклассы.
- •69. Паттерны проектирования: Абстрактная фабрика.
- •70. Паттерны проектирования: Одиночка.
- •71. Паттерны проектирования: Прототип (виртуальный конструктор).
- •72. Паттерны проектирования: Адаптер.
- •73. Паттерны проектирования: Заместитель.
- •74. Паттерны проектирования: Компоновщик.
- •75. Паттерны проектирования: Декоратор.
- •76. Паттерны проектирования: Итератор.
- •77. Паттерны проектирования: Шаблонный метод.
32. Исключительные ситуации: назначение и стандартные искл. Ситуации (кроме stl).
В ходе выполнения функции может произойти исключительная ситуация, когда из-за обнаруженной ошибки продолжить нормальное выполнение алгоритма невозможно. Выполнение этого алгоритма должно завершиться, затем функция может:
Выдать сообщение об ошибке и аварийно завершить выполнение программы. Недостатки: снижается надежность программы, введенная пользователем информация теряется, нет возможности предпринять альтернативные действия, например, сохранить информацию на другом диске.
Вернуть специальное значение. Например, функция malloc при ошибке выделения памяти возвращает NULL. Недостатки: область значений функции может содержать все значения типа результата функции, проверка результата каждого вызова в сложном выражении невозможна, а в более простых приводит к существенному увеличению размера программы, поэтому часто проверка не выполняется.
Установить состояние ошибки в специальной глобальной переменной. Например, математические функции записывают код ошибки в errno. Недостатки: проверка этой переменной после каждого оператора с вызовом функции приводит к существенному увеличению размера программы, поэтому часто проверка не выполняется.
Вызвать специальную функцию обработки ошибки. Например, некоторые реализации математических функций при ошибке вызывают функцию matherr. Недостатки: при отсутствии исключений эта функция должна выполнить одно из трех рассмотренных ранее действий.
Механизм исключений позволяет передать управление и всю необходимую информацию в ту часть программы, которая сможет обработать данную ошибку, а затем продолжить нормальное выполнение программы. Размер программы при этом не увеличивается. Все стандартные исключения являются производными от класса exception. К стандартным исключениеям относятся:
bad_alloc, генерируемое операцией new;
bad_cast, генерируемое операцией dynamic_cast;
bad_typeid, генерируемое операцией typeid;
bad_exception, генерируемое для обработки исключения, непредусмотренном в заголовке функции;
исключения, порождаемые классами и алгоритмами STL.
33. Исключительные ситуации: порождение и перехват (синтаксис).
Для порождения исключений используется оператор throw выражение; Рекомендуется указывать в качестве аргумента объекты специальных классов, а не стандартных типов (int) или классов общего назначения (vector). Классы исключений рекомендуется выстраивать в иерархии. Операторы, которые могут генерировать исключения, записываются внутри блока try, после которого идет набор обработчиков исключений catch. У каждого обработчика указывается тип исключений, который он может перехватывать, и опционально имя, с помощью которого можно обращаться к созданному оператором throw объекту внутри обработчика. Перехват исключения рекомендуется делать по ссылке, чтобы избежать срезки объекта при преобразовании к базовому классу.
try
{ // операторы
}
catch(bad_alloc &)
{ // обработка ошибки выделения памяти
}
catch(io_error & e)
{ e.stream.clear(); // обработка ошибки ввода-вывода
}
catch(exception &)
{ // обработка других стандартных исключений
}
Порядок обработки исключений следующий:
Создается копия аргумента throw в статической памяти.
Происходит поиск подходящего обработчика. В процессе поиска выполняется раскрутка стека, т.е. выход из функций, где нет подходящих обработчиков и вызов деструкторов для локальных объектов.
Если подходящий обработчик найден, управление передается ему, иначе вызывается функция terminate, которая по умолчанию аварийно завершает программу, но можно задать другое действие с помощью функции set_terminate
После выполнения обработчика копия аргумента throw в статической памяти уничтожается и управление передается на оператор, следующий за последним из обработчиков того набора, где был найден обработчик.
Если обработчик не смог полностью обработать исключение, то можно повторно сгенерировать исключение внутри обработчика с помощью оператора throw; Проверка на соответствие типа объекта и обработчика выполняется в порядке перечисления обработчиков, поэтому обработчики для исключений производных классов должны быть указаны до обработчиков базовых классов. Самым последним обработчиком в наборе может быть указан catch(...), который перехватывает все исключения. Такой обработчик можно использовать для корректного освобождения ресурсов:
int g(int n)
{
int * a;
a=new int[n];
try
{ // ...
}
catch(...)
{ delete[] a;
throw;
}
delete[] a;
}
