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

14. Деструкторы и очистка.

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

- для локальных объектов — при выходе из блока, в котором они объявлены;

- для глобальных — как часть процедуры выхода из main;

- для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete.

Имя деструктора начинается с тильды (~), непосредственно за которой следует имя класса. Если деструктор явным образом не определен, компилятор автоматически создает пустой деструктор. Описывать в классе деструктор явным образом требуется в случае, когда объект содержит указатели на память, выделяемую динамически — иначе при уничтожении объекта память, на которую ссылались его поля-указатели, не будет помечена как свободная. Указатель на деструктор определить нельзя.

Деструктор:

- не имеет аргументов и возвращаемого значения;

- не может быть объявлен как const или static;

- не наследуется;

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

Деструктор должен выглядеть так:

monstr::~monstr() {delete [] name;}

  1. Статические члены: функции и данные.

Если переменная объявлена как static, то компилятор выделяет ей, как и глобальной переменной, постоянное место в памяти. Значение этой переменной сохраняется между вызовами блоков программы, в которых она объявлена(нестатические локальные переменные между вызовами функций уничтожаются).

Отличие от глобальной в том, что она доступна только в своём блоке кода(функции или файле). Применяется, например, при вызовах COLLBACK функций ,которые вызываются при поступлении в приложение сообщений. При этом значения переменных объявленных static, сохраняются. Все другие переменные необходимо заново инициализировать. Если объявить переменную-член класса как статическую, то компилятор создаст для всех объектов один общий экземпляр этой переменной. Эта переменная не будет копироваться  для всех объектов данного класса, как это происходит для нестатических членов.

Небольшой пример:

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

 static int j;

 j++;  cout<<j<<' ';

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

В классах - это что-то типа глобальной переменной. Она (переменная) принадлежит всему классу, а не отдельным его объектам.

16. Структуры и объединения.

Тип «структуры» - набор элементов различных типов. Пример в C++:

struct <имя_типа_структура>

{

t1 p1, t2 p2, …, tn pn;

};

t1 … tn – имена типов данных;

p1 … pn – имена проектированных функций (полей структуры).

Два структурных типа будут являться разными типами даже если у них одинаковые поля.

Тип объединения реализует математическую операцию объединения множеств. Объединение – структура, у которой в любой момент времени существует значение только одного из компонент (все компоненты по одному и тому же адресу). Поэтому при хранении объектов объединения достаточно лишь выделить память под максимальный компонент:

union <имя_типа_объекта> {t1 p1; … ; tn pn;};

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