- •45. Вызовы конструкторов в процессе работы программы.
- •48. Деструкторы.
- •49. Поля данных. Нестатические и статические поля – особенности их создания и инициализации. Правила обращения к полям. Константные поля.
- •50. Методы. Основные правила работы с методами. Константные методы. Статические методы.
- •51. Указатель this.
- •52. Дружественные функции и классы.
- •53. Перегрузка операций – общие положения.
- •54. Перегрузка операции присваивания. Особенности работы с ресурсоемкими объектами.
- •55. Перегрузка унарных операций.
- •56. Перегрузка бинарных операций.
- •57. Особенности определения классов с ключами struct и union.
- •58. Включение классов.
- •59. Наследование классов – общие положения.
- •Класс а
- •61. Общие особенности механизма простого наследования классов.
- •62. Множественное наследование.
- •63. Перечень специальных методов класса. Особенности определения конструкторов и деструкторов в производных классах.
- •64. Особенности определения и применения функций-операций «присваивание» в производных классах.
- •65. Особенности перегрузки операций в производных классах.
- •66. Общая характеристика виртуальных функций.
48. Деструкторы.
Деструктор – специальный метод, предназначенный для выполнения действий которые по логике работы алгоритма или по правилам С++ должны совершаться при уничтожении объекта.
С учетом семантики атрибута «продолжительность существования» объект, как и любая переменная будет уничтожен, а значит деструктор будет автоматически вызываться в следующих ситуациях:
для логического объекта: при вызове из блока
для глобального объекта: при завершении работы main
для объекта созданного указателем: при использовании delete, при выходе из области самого указателя на объект деструктор не вызывается, и объет не удаляется
Деструктор обозначается:
<имя класса>
Деструктор:
не имеет аргументов и не возвращает никакого значения
он не может быть определен с const и static
не наследуется
он не может быть виртуальным
Если деструктор не объявлен явно, то компилятор создаст пустой деструктор с public. Он будет вызываться в соответствии с логикой программы, но не будет совершать никаких действий. Во многих ситуациях программисту хватает автоматического деструктора, однако, если в объектах класса предполагается использование дополнительных ресурсов, то специальный деструктор необходим, иначе ресурсы зависнут, и сформируется мусор. Свой деструктор может понадобиться, если при уничтожении объекта следует
~TTochka_v_pole ( ); // (1)
Определим деструктор вне класса:
TTochka_v_pole::~TTochka_v_pole ( ) { // (2)
FLivePoint--;
// Сообщаем на экран номер уничтоженной точки
cout<< “уничтожена точка номером”;
if (Fname1) {cout << “по имени_\ “ “; // (4)
int i = 0; // (5)
while (*(Fname1+i)!= ‘\0’) // (6)
cout << *(Fname1+i++); // (7)
:cout << “\” << endl: } // (8)
// уничтожим динамическую область если она создана
if (Fname1) {delete [ ] Fnam1;} // (9)
} // (10)
Деструктор в отличие от конструктора можно вызвать явно, !однако!, такой вызов может не соответствовать синтаксису.
49. Поля данных. Нестатические и статические поля – особенности их создания и инициализации. Правила обращения к полям. Константные поля.
Поля данных – это инкапсулированные в объект (не статические поля) или в класс в целом (статические поля). Как и обычные переменные, они могут относиться к различным классам. Они могут оснащать при необходимости дополнительные атрибуты. Поля делятся на 2 вида: на нестатические и статические. Они объявляются со спецификаторами static. Принципиальное различие таково: при создании каждого объекта ему выделяют свои уникальные нестатические поля, в которых другие объекты данного доступа не имеют, статические поля создаются в одном экземпляре.
В отличие от обычной переменной определение поля фактически разбивается на 2 этапа:
при определении класса поле только объявляется, как будущий элемент, при этом память на поле не отводится, так как поле не создает область памяти в которую можно было бы поместить инициализированное значение
определение полей осуществляется для нестатических полей в процесс6е определения для статических полей в процессе инициализации
Процесс для подсчета точек:
int TTochka_v_pole::Fcouter = 0; // (1)
Укажем основные особенности этого оператора, сначала для поля отводят необходимую область памяти, а затем она инициализируется заданным значением
обращение к полю возможно только через квалифицированное имя, то несть с применением доступа к имени класса
этот оператор должен задаваться глобально
Обращение к любым полям после их создания может осуществляться по следующим правилам:
если поле определено с помощью спецификатора private, protected, то к нему можно обращаться внутри некоторого открытого метода
если поле объявлено с public, то к нему можно обратиться от имени объекта при помощи операции «•», либо доступом по адресу «→»
Примеры:
Point.Fmax Z // (2) обращение с использованием «•»
Ptr Point → Fmax Z // (3) обращение к полю по указателю
Константные поля.
Поле можно объявить константно, но при этом оно не может быть статическим. Например добавим в класс TTochka_v_pole поле, которое будет содержать ограничение на количество точек, которое можно создать в программе.
Const int Kol_point; // (4) инициализировать такие поля можно только в спецификаторах, причем делать это надо во всех конструкторах, которые объявлены явно
Например:
ТТochka_v_pole:: TTochka_v_pole (odn_mas RO, odn_mas VO, int Mp, color c, double g): Vol_point (10) // (5) обращаться к таким полям можно только для чтения