Экземпляр объекта создается посредством описание переменной или константы объектного типа или путем применения стандартной процедуры New к переменной типа указатель на объектный тип. Ре- зультирующий объект называется экземпляром объектного типа.
var F: TField; Z: TZipField; FP: PField; ZP: PZipField;
С учетом этих описание переменных F является экземпляром TField, а Z - экземпляром TZipField. Аналогично, после применения New к FP и ZP, FP будет указывать на экземпляр TField, а ZP - на экземпляр TZipField.
Если объектный тип содержит виртуальные методы, то экземпля- ры этого объектного типа должны инициализироваться посредством вызова конструктора перед вызовом любого виртуального метода. Ни- же приведен пример:
var S: StrField; begin S.Init (1, 1, 25, 'Первое имя'); S.Put ('Френк'); S.Display; ... S.Done; end;
Если S.Init не вызывался, то вызов S.Display приведет к неу- дачному завершению данного примера.
Присваивание экземпляра объектного типа не подразумевает инициализации экземпляра.
Объект инициализируется кодом, генерируемым компилятором, который выполняется между вызовом конструктора, и когда выполне- ние фактически достигает первого оператора в блоке кода конструк- тора.
Если экземпляр объекта не инициализируется, и проверка диа- пазона включена (директивой {$R+}), то первый вызов виртуального метода экземпляра объекта дает ошибку этапа выполнения. Если про- верка диапазона выключена (директивой {$R-}), то первый виртуаль- ного метода неинициализированного объекта может привести к неп- редсказуемому поведению.
Правило обязательной инициализации применимо также к экземп- лярам, которые являются компонентами структурных типов. Например:
var Comment: array [1..5] of TStrField; I: integer; begin for I := 1 to 5 do Comment [I].Init (1, I + 10, 40, 'первое_имя'); . . . for I := 1 to 5 do Comment [I].Done; end;
Для динамических экземпляров инициализация, как правило, связана с размещением, а очистка - с удалением, что достигается благодаря расширенному синтаксису стандартных процедур New и Dispose. Например: