- •Вопрос 1. Ссылки и ссылочные параметры.
- •Вопрос 2. Перегрузка функций.
- •Вопрос 3. Шаблоны функций.
- •Вопрос 4. Использование const с указателями.
- •Вопрос 5. Область действия класса. Управление доступом к членам класса. Отделение интерфейса от реализации.
- •Вопрос 6. Понятие конструктора .Использование констр-ра с аргументами по умолчанию. Конструктор по умолчанию.
- •Вопрос 7. Понятие деструктора. Когда вызывается конструктор и деструктор.
- •Вопрос 8. Константные объекты и функции-члены.
- •Вопрос 9. Дружественные функции и друж. Классы.
- •Вопрос 10. Указатель this.
- •Вопрос 11. Операции new и delete.
- •Вопрос 12. Статические члены класса.
- •Вопрос 13. Понятие перегрузки операций.
- •Вопрос 14. Функции-операции как члены класса и как друж-е функции
- •Вопрос 15. Перегрузка операций ввода/вывода в поток, бинар и унар операций.
- •Вопрос 17. Перегрузка операций индексации массива.
- •Вопрос 18. Понятие наследования. Механизм ограничения доступа при наследовании.
- •Вопрос 19. Приведение типа указателя базового класса к указателю производного класса и наоборот.
- •Вопрос 21. Конструкторы и деструкторы в производных классах.
- •Вопрос 22. Неявное преобразование объектов производных классов в объекты базового класса.
- •Вопрос 23. Иерархия классов. Уровни наследования.
- •Вопрос 24. Множественное наследование.
- •Вопрос 25. Неопределённость при множ-м наследовании. Включение «классы в классах».
- •Вопрос 26. Понятие виртуальной функции.
- •Вопрос 27. Понятие полиморфизма.
- •Вопрос 28. Абстрактные и конкретные базовые классы.
- •Вопрос 29. Статическое и динамическое связывание.
- •Вопрос 30. Виртуальные деструкторы.
- •Вопрос 31. Шаблоны классов.
- •Вопрос 32. Шаблоны классов и пользовательские типы
- •Вопрос 33. Шаблоны и наследование.
- •Вопрос 34. Классы и объекты потоков ввода/вывода. Иерархия потоковых классов.
- •Вопрос 35, 38. Предопределённые потоковые объекты. Состояние ошибок потока.
- •Вопрос 36. Манипуляторы потоков.
- •Вопрос 37. Неформатированный ввод/вывод с помощью read/ write
- •Вопрос 38. Состояние ошибок ввода/вывода
- •Вопрос 39. Понятие исключения. Когда должна использоваться обработка исключений.
- •Вопрос 40. Генерация исключений. Повторная генерация исключений.
- •Вопрос 41. Перехват исключений.
- •Вопрос 42. Спецификация исключений. Обработка неожиданных исключений.
- •Вопрос 43. «Раскручивание» стека. Иерархия исключений стандартной библиотеки.
- •Вопрос 44. Конструкторы, деструкторы и исключения. Исключения и наследование.
- •Вопрос 45. Обработка неуспешного выполнения new.
- •Вопрос 46. Класс auto_ptr и динамич выделение памяти.
- •Вопрос 47. Static_cast, reinterpret_cast
- •Вопрос 48. Инфо о типе времени выполнения. Оператор dynamic_cast
- •Вопрос 49. Ключевое слово explicit.
- •Вопрос 50. Ключевое слово mutable.
- •Вопрос 51. Указатели на члены класса.
- •Вопрос 52. Множественное наследование. Виртуальные базовые классы.
- •Вопрос 53. Классы-контейнеры и классы-итераторы.
- •Вопрос 54. Понятие ооп. Три условия ооп-программы. Парадигмы ооп.
- •Вопрос 55.Основные составляющие объектного подхода: абстрагирование, инкапсуляция, модульность.
- •Вопрос 56. Основные составляющие объектного подхода: иерархия, типизация, полиморфизм.
- •Вопрос 57. Природа объекта. Состояние, поведение, идентичность объекта.
- •Вопрос 58. Отношения между объектами. Связи. Агрегация.
- •Вопрос 59. Природа классов. Отношения между классами. Типы отношений.
Вопрос 44. Конструкторы, деструкторы и исключения. Исключения и наследование.
Предположим, что произошла ошибка при выполнении конструктора какого-то объекта. При возникновении ошибки в конструкторе, в нем генерируются исключение. Обработчик должен иметь доступ к объекту. Если в конструкторе генерируются исключение, то перед тем, как управление передаётся на обработчик вызываются деструкторы всех полностью созданных объектов базовых классов
Вызов деструктора помещается в блоке try и исключение отлаживается в блоке catch. Если в блоке catch указывается указатель или ссылка на базовый класс, то этот блок catch будет отлаживать и исключения всех производных классов.
Деструкторы вызываются для каждого автоматического объекта, созданного в блоке try. Исключение обрабатывается в момент, когда начинает выполняться обработчик; разматывание стека завершается к этому времени. Если деструктор, вызываемый в результате разматывания стека, генерирует исключение, то вызывается ф-ция завершения terminate и программа завершается.
Uncaught_exception() – проверка, как уничтожен объект; возвращает true, если всё нормально
Исключения и наследование
Различные классы исключений могут быть порождены из общего базового класса. Если написан catch для перехвата объектов исключений типа базового класса, он может также перехватывать все объекты классов, порожденных из этого базового класса. Это позволяет осуществлять полиморфную обработку родственных ошибок.
Достоинство наследования для исключений:
дает возможность обработчику исключений перехватывать родственные ошибки, используя очень компактную запись.
Вопрос 45. Обработка неуспешного выполнения new.
Существует несколько методов обработки неуспешного выполнения new. Чаще используется макрос assert для проверки значения, возвращаемого new. Если это значение = 0, макрос assert завершает программу. Недостаток: не обеспечивается восстановление после ошибок.
Если оператор new не может выделить память, то генерируется исключения bad_alloc(чаще возвращает - 0), set_new_handler (принимает в кач-ве аргумента ук-ль на ф-цию, к-ая не принимает аргументов и возвращает void. Этот ук-ль регистрируется как ф-ция, к-ая должна вызываться при отказе new).
Операция new в действительности явл-ся циклом, к-ый пытается получить память.
Если память выделяется, new возвращает указатель на нее. Если память не выделена и никакой ф-ции обработчика new с помощью set_new_handler зарегистрировано не было, операция new выбрасывает исключение bad_alloc. Если память не выделена и была зарегистрирована функция обработчика new, то вызывается эта ф-ция. Ф-ция обработчика new должна выполнить одно из следующих действий:
1. увеличить объём доступной памяти путем освобождения других областей динамической памяти и возвратиться в цикл new, возобновив попытки выделения памяти.
2. выбросить исключение типа bad_alloc.
3. вызвать ф-цию abort или exit для завершения программы.
int main()
{double *ptr[50];
try {
for(int i=0;i<50;i++)
{ ptr[i]=new double[5000000];
cout<<”Память выделена”;
}
}
catch(bad_alloc exception){
cout<<exception.what();
}