Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
110
Добавлен:
02.05.2014
Размер:
94.21 Кб
Скачать

Лекция № 12 Классы. Инициализация/уничтожение объектов.

Тип данных вводятся через множество операций и соответствующую им структуру данных, т.е. множество значений Если объект требует инициализации, а как правило даже тривиальная структура данных требует инициализации, прежде чем мы начнем с ней работать. Добавляют функцию типа:

T int (var X: T)

Если объект захватывает при своей инициализации какие-то ресурсы, то при уничтожении он обязан их освободить. Причем наиболее распространенный вид ресурса – это оперативная динамическая память. Если объект захватывает динамическую память, он должен ее освободить. Надо вовремя вызвать init и

Destroy (var X:T);

То есть

Init и Destroy полностью лежат на совести программиста.

Есть языки, где имеется динамическая сборка мусора. Например, Ада некоторые реализации, здесь динамическая сборка мусора лежит на разработчике. Оберон уже по определению имеет динамическую сборку мусора.

Динамическая память не является единственным ресурсом системы. У нас есть внешние устройства, файлы, которые , если мы открываем, то не должны забывать закрывать. Традиционные ЯП на поддержку инициализации и удаление объекта никак не реагируют, т.е. программист сам должен, если он объявил некоторую переменную данного типа, выполнить инициализацию и в случае, если необходимо соответствующее освобождение ресурсов, должен выполнить нужный destroy. Если он забыл это сделать, то только в отладочных средах есть соответствующие механизмы, позволяющие схватить программиста за руку. Но это только в динамических средах. В первые проблема такого рода роде решена в языке С++, где введены специальные функции, в частности разновидности этих функций: конструкторы и деструкторы. В чем специальность этих функций? Они имеют так называемую системную семантику, т.е. компилятор об этих функциях знает несколько больше, чем о других функциях-членах классов. Компилятор автоматически вставляет вызов конструктора, когда объект размещается в память. Мы с Вами говорили, что в С++ есть три вида памяти – это статическая, квазистатическая (внутри блока) и динамическая.

Т х;

Если статическая переменная х, то конструктор вызывается до начала работы программы, т.к. время жизни статической переменной равно времени выполнения программы. То есть появляется понятие стандартного пролога. Там происходит инициализация среды, инициализация некоторых базовых переменных процесса, инициализация стандартного канала ввода и вывода. Это все зашито в процесс компиляции, и пользователь иначе как пере компилируя программу с заменой объектного файла, который меняется от реализации к реализации, никак больше не может регулировать стандартный пролог и стандартный эпилог. Язык С++ к стандартному прологу языка С добавляет вызов статических конструкторов. Компилятор вставляет этот вызов автоматически, в этом и состоит специальность функций конструктора.

Конструктор имеет имя такое же как и класс.

Class X {

X(…) конструктор, он ничего не возвращает.

};

Конструктор – это то, как говорил Страуструп, что превращает кусок памяти в настоящий объект. Деструктор вызывается при удалении объекта из памяти. Для статических объектов конструктор вызывается в стандартном прологе, а деструктор – в эпилоге. Для локальных объектов у нас конструктор вызывается, когда управление проходит через вызов данного объекта, ну и деструктор вызывается, когда мы выходим из блока. Блок можно покинуть двумя путями: либо через закрывающую скобку, либо, если этот блок составляет тело функции, через оператор return. Есть еще один способ, который будет обсуждаться позже, -- это выход, если в программе возникла аварийная ситуация. Для объектов динамической памяти, когда вызывается new, вызывается еще и конструктор, а когда delete – еще и деструктор. Как правило, явным образом мы не вызываем конструктор и деструктор, хотя имеем полное право это сделать.

Class X {

Соседние файлы в папке Лекции по программированию на ЯВУ