- •Конспект по "Объектно-ориентированному программированию".
- •1. Что такое объект? Понятия "состояние" и "поведение"?
- •2. Понятия "интерфейс" и "реализация"?
- •3. Понятия "класс" и "абстрактный тип данных"?
- •4. Основные категории классов?
- •5. Объявление класса? Общий вид объявления класса? Включение кода метода внутри объявления класса?
- •6. Особенности локальных классов?
- •7. Понятие inline-метода. Способы создания?
- •9. Константный объект? Константный метод?
- •10. Конструктор. Его назначение и синтаксические конструкции вызова конструктора?
- •11. Конструктор копирования. Общий вид и случаи вызова?
- •12. Что называется конструктором по умолчанию? Конструктором преобразования?
- •13. Основные свойства и правила использования конструкторов.
- •14. Деструктор. Вызов деструкторов (автоматический и явный).
- •15. Основные свойства и правила использования деструкторов.
- •16. Создание и уничтожение объектов.
- •17. Что такое наследование?
- •18. Понятия "базовый класс" и "производный класс"?
- •19. Принцип подстановки. Различие между понятиями "подкласс" и "подтип"?
- •20. Основные формы наследования?
- •21. Преимущества наследования?
- •22. Недостатки наследования?
- •23. Общая форма наследования классов? Спецификаторы доступа при наследовании?
- •24. Конструкторы и деструкторы производных классов? Порядок вызова конструкторов и деструкторов при множественном наследовании?
- •25. Множественное наследование. Общая форма?
- •26. Передача параметров в базовый класс. Назначение. Общая форма?
- •27. Указатели и ссылки на производные классы?
- •28. Виртуальная функция. Объявление виртуальной функции?
- •29. Чисто виртуальная функция. Общая форма чисто виртуальной функции?
- •30. Понятие "абстрактный класс".
- •31. Что такое полиморфизм? в каких формах он может существовать?
- •32. Понятие "перегрузка"?
- •33. Приведение типа. Неопределенность. Причины возникновения неопределенности и способы ее устранения?
- •34. Понятие "параметрическая перегрузка"?
- •35. Понятие "переопределение"? в чем заключается различие между перегрузкой и переопределением?
- •36. В чем заключается процесс уточнения?
- •37. Что такое шаблоны (или обобщенные функции)? Их назначение?
- •38. Функция-шаблон. Назначение функции-шаблона? Общий вид функции-шаблона?
- •39. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?
14. Деструктор. Вызов деструкторов (автоматический и явный).
Деструктор – это особый вид метода, применяющийся для освобождения памяти, занимаемой объектом.
Деструктор имеет то же имя, что и класс, в котором он объявляется, с префиксом тильда (~).
Например:
monstr::~monstr()
{
delete [ ] name;
}
Деструктор вызывается автоматически, когда объект выходит из области видимости:
– для глобальных объектов – как часть процедуры выхода из функции main;
– для локальных объектов – при выходе из блока, в котором они объявлены;
– для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete.
Автоматический вызов деструктора не производитсяпри выходе из области действия указателя на него.
Деструктор объявляется явно, когда объект содержит указатели на память, выделяемую динамически – иначе при уничтожении объекта память, на которую ссылались поля-указатели, не будет помечена как свободная.
Например, при указании полностью уточненного имени деструктор будет иметь вид:
monstr *m;
…
m->~monstr();
Явное определение деструктора может понадобиться для объектов, которым с помощью операции newбыл выделен конкретный адрес памяти.
Без необходимости явно вызывать деструктор объекта не рекомендуется.
Нельзя определить указатель на деструктор.
15. Основные свойства и правила использования деструкторов.
Основные свойства и правила использования деструкторов:
– класс может иметь только один деструктор;
– деструктор имеет то же имя, что и класс, в котором он объявляется, с префиксом тильда (~);
– деструктор не имеет параметров (аргументов);
– деструктор не возвращает значения (даже типа void);
– конструкторы нельзя объявлять как constилиstatic;
– деструктор не наследуется в производных классах. Но производный класс может вызывать деструкторы для его базовых (родительских) классов;
– деструктор – это функция, и он может быть виртуальным (его можно объявить с ключевым словом virtual);
– в программе невозможно получить адрес деструктора (указатель на деструктор);
– если деструктор не задан в программе, он будет автоматически сгенерирован компилятором для уничтожения соответствующих объектов. Все деструкторы, сгенерированные таким образом, имеют атрибут public;
– деструктор можно вызвать так же, как обычную функцию, если использовать его полное имя. Например, Х*р; ... р->Х::Х()
– деструктор вызывается автоматически только разрушении (уничтожении) объекта;
– объект, содержащий деструктор, нельзя включить в виде компонента в объединение (union);
– при вызове библиотечной функции exit вызываются деструкторы только для глобальных объектов;
– при вызове библиотечной функции abort никакие деструкторы не вызываются;
– если память под объект выделена через указатель с помощью оператора new, то при прекращении существования этого указателя объект автоматически не разрушается. Для разрушения объекта в программе надо использовать оператор delete.
16. Создание и уничтожение объектов.
Для создания объекта класса вызывается конструктор, для разрушения (уничтожения) объекта – деструктор. Каждый объект имеет некоторое время существования. Это время определяется тем, где (в какой области памяти) и как (каким способом) создан объект. Объекты могут быть созданы в следующих формах:
– глобальные объекты– последовательность их создания определяется последовательностью их объявления. Разрушение объектов производится в обратном порядке.
– локальные (автоматические) объекты– последовательность их создания определяется последовательностью их объявления. Разрушение объектов производится в обратном порядке.
– статические объекты:
Глобальные статические объектыконструируются в порядке их объявления в начале выполнения программы и разрушаются в обратном порядке при завершении программы.
Локальные статические объектыконструируются один раз при первом их описании и разрушаются при завершении программы.
Если программа завершается вызовом функции exit(), то деструкторы для сконструированных ранее объектов будут вызваны. Но если программа завершается вызовом функции abort(), деструкторы не будут вызваны.
– объекты в динамически выделяемой области памяти – если объект сконструирован с помощью встроенного оператора для динамического выделения памяти new, то он должен быть разрушен явно с помощью встроенного оператора для динамического освобождения памяти delete.
– объекты-компоненты классов– при их создании конструктор объекта, являющегося компонентом другого класса, вызывается при вызове конструктора класса, в котором этот объект объявлен. Конструкторы для нескольких объектов-компонентов вызываются в порядке их объявления перед конструктором класса, в котором они объявлены. Все деструкторы вызываются в обратном порядке.
– объекты-элементы массивов– создаются при создании массива объектов одного типа. Причем хотя бы один из конструкторов этих объектов должен иметь параметры, заданные по умолчанию, так как при объявлении массива объектов невозможно определить параметры для конструкторов этих объектов и единственная возможность вызова конструкторов – это передача им параметров, заданных по умолчанию.
Конструкторы и деструкторы для массива объектов вызываются по правилам построения и разрушения объектов в определенной области памяти: глобальная память, локальная память, статическая память, динамическая память, объекты-компоненты другого класса (см. выше).