Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++.docx
Скачиваний:
19
Добавлен:
10.06.2015
Размер:
95.05 Кб
Скачать

48. Деструкторы.

Деструктор – специальный метод, предназначенный для выполнения действий которые по логике работы алгоритма или по правилам С++ должны совершаться при уничтожении объекта.

С учетом семантики атрибута «продолжительность существования» объект, как и любая переменная будет уничтожен, а значит деструктор будет автоматически вызываться в следующих ситуациях:

  • для логического объекта: при вызове из блока

  • для глобального объекта: при завершении работы main

  • для объекта созданного указателем: при использовании delete, при выходе из области самого указателя на объект деструктор не вызывается, и объет не удаляется

Деструктор обозначается:

<имя класса>

Деструктор:

  1. не имеет аргументов и не возвращает никакого значения

  2. он не может быть определен с const и static

  3. не наследуется

  4. он не может быть виртуальным

Если деструктор не объявлен явно, то компилятор создаст пустой деструктор с 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 этапа:

  1. при определении класса поле только объявляется, как будущий элемент, при этом память на поле не отводится, так как поле не создает область памяти в которую можно было бы поместить инициализированное значение

  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) обращаться к таким полям можно только для чтения

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]