Атомная энергетика. Ядерные реакторы АЭС. Атомный флот. Ядерное оружие |
|||
| РБМК-1000 | |||
| Гражданский суда | |||
| Авиация | |||
Высшая математика |
|||
| Задачи | |||
| Практикум | |||
| Карта сайта | |||
Объектные переменные во многом подобны обычным переменным Турбо Паскаля, в частности, их можно размещать в динамической памяти. Турбо Паскаль содержит средства, облегчающие размещение объектных переменных в куче и их удаление из нее, например:
…
Vаг PLine:^TLine;
New(PLine, Init);
…
В этом примере размещение объектной переменной (на нее указывает PLINE) в куче сопровождается одновременным обращением к конструктору TUNB.INIT для инициализации объекта и связывания виртуальных методов с вновь созванной переменной: в процедуре NEW допускается в качестве второго параметра указывать обращение к конструктору.
Более того, процедуру New можно вызывать и как функцию — в этом случае она возвращает значение типа POINTER, указывающее на динамически распределенный объект:
PLine := New(TLine);
или
PLine := New(Tline, Init);
Обратите внимание: первым параметром процедуре New передается указатель на динамически распределяемый объект, в то время как первым параметром функции New — тип распределяемого объекта. И в том, и в другом случае в качестве второго параметра обращения допускается использовать вызов конструктора, однако имя конструктора не может быть составным — ведь в момент обращения динамический объект еще не создан. Например, оператор
New(Pline, PLine^.lnIt);
вызовет сообщение об ошибке.
При обращении к NEW с одновременным вызовом конструктора динамическая память резервируется с помощью специального программного кода, входящего в любой конструктор и вызываемого до начала работы исполняемой части конструктора (до begin). При этом динамическая память может оказаться исчерпанной. В этом случае стандартная функция обработки ошибок администратора кучи выдает значение 0, что вызывает аварийное завершение программы с кодом ошибки 203. Если используется нестандартная функция обработки ошибок и эта функция возвращает 1, конструктор пропускает операторы после begin и возвращает NIL. Таким образом гарантируется, что исполняемые операторы конструктора будут работать только при условии нормального распределения динамической памяти. Однако в теле конструктора может быть создан новый динамический объект, в нем – свой и т.д. Турбо Паскаль допускает произвольную глубину вложенности конструкторов. Если на каком-то уровне обнаружится нехватка динамической памяти, необходимо ликвидировать всю цепочку успешно распределенных объектов. Чтобы эта операция стала возможной, в Турбо Паскаль введена стандартная процедура без параметров FAIL, которая может вызываться только из конструктора и которая освобождает уже выделенную конструктором память, завершает его работу и возвращает NIL.
Для удаления динамического объекта из кучи используется особый метод — деструктор, описываемый с помощью зарезервированного слова DESTRUCTOR. В этом методе можно предусмотреть все действия, связанные с ликвидацией динамического объекта (т.е. переменной объектного типа, размещенной в динамической памяти), например, осуществить. нужную коррекцию списка динамических объектов. Обращение к деструктору указывается вторым параметром при вызове процедуры DISPOSE, например:
Type
TLine = object(Point)
Constructor Init;
Destructor Done;
end;
…
New(PLine, Init); {Размещение динамического объекта}
…
Dispose(Pline, Done);{Удаление динамического объекта}
При необходимости деструктор, как и любой другой метод объекта (кроме конструктора!) , можно объявить виртуальным.
| Основные понятия об информации и информатике |