logo
Проектирование инт-прил / лекции / Проектирование инет приложений

Жизненный цикл класса

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

Для правильной инициализации объектов существуют специальные функции - конструкторы. Соответственно, для корректного освобождения занятых объектом ресурсов операционной системы служат деструкторы. Пример класса с конструктором и деструктором на C++:

class SomeClass {

private:

// Просто некое целочисленное поле класса -

// для демонстрации инициализации полей в конструкторе.

int _field;

public:

// Пустой конструктор (без параметров).

SomeClass() {

};

// Конструктор, содержащий некий параметр.

SomeClass(int f) {

_field = f;

};

// Деструктор класса.

~SomeClass() {

// В данном случае действие бессмысленно,

// оно демонстрирует, что в деструкторе можно

// что-либо выполнять. Как правило, в деструкторе

// освобождают занятые в ходе работы класса

// ресурсы операционной системы. Например,

// закрывает файлы, которые были открыты объектом.

_field = 0;

};

};

Работа с объявленным выше классом из программы могла бы выглядеть следующим образом:

// Цикл for нужен для создания вложенного блока программы,

// по завершению которого отработается деструктор.

for (int i=0; i<2; i++) {

// Неявно будет вызван конструктор класса, имеющий

// пустые параметры.

SomeClass s;

}; // Вложенный блок закончился, объект s больше не

// существует. Следовательно, будет вызван деструктор.

// Неявно будет вызван конструктор класса, имеющий

// целочисленный параметр.

SomeClass * s1 = new SomeClass(3);

// Будет вызван деструктор класса, класс - уничтожается.

delete( s1 );