Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции програм_new_последняя версия1.doc
Скачиваний:
14
Добавлен:
14.09.2019
Размер:
697.34 Кб
Скачать

Объекты

В Delphi объект – динамическая структура. Переменная объект содержит не данные, а ссылку на данные объекта, то есть переменные a,b являются указателями, содержащими адреса объектов. Поэтому программист должен позаботиться о выделении памяти для этих данных. Форма обращения к объектам классов в Object Pascal отличается от формы обращения к другим указателям и динамическим переменным. Для обращения к полям и методам объекта в Object Pascal не надо использовать «^».

Таким образом класс и объект этого класса описываются:

Type

<имя класса> = class (<имя класса - родителя>)

{поля, методы, свойства}

end;

{описания методов класса}

Var

<имя объекта>: <имя класса>;

Создание и уничтожение объектов.

В состав любого класса входят два специальных метода: конструктор и деструктор. Эти методы у класса TObject называются Create и Destroy, так же они называются и в большинстве его потомков.

Определение: Конструктор – специальный метод, который распределяет объект в динамической памяти и помещает адрес начальной ячейки памяти в переменную Self, которая автоматически объявляется в классе.

Определение: Деструктор– специальный метод, который удаляет объект из динамической памяти.

Обращение к конструктору должно предшествовать любому обращению к полям и методам объекта. Т.о. объект «появляется на свет» в результате вызова конструктора Create, который инициализирует объект.

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

Delphi осуществляет инициализацию полей класса: все числовые поля инициализируются нулем, строковые – пустой строкой, логические – значением false, указатели – значением nil.

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

<имя объекта>:= <имя класса>.<имя конструктора>;

Нужно указать еще и фактические параметры, если они есть .

Например:

a:= ТСomp. Create;

Здесь появляется объект a.

Внимание! Как же так, ведь объекта еще нет, а мы уже вызываем его метод. Обратим внимание на то, что вызывается метод ТСomp.Create, а не a.Creatе.

Для освобождения памяти, занятой объектом, используется специальный метод – деструктор, который обычно имеет имя Destroy.

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

<имя объекта>.< имя деструктора>;

Например: a .destroy;

По своей форме конструкторы и деструкторы являются процедурами, но объявляются в классе с помощью зарезервированных слов Constructor и Destructor.

Type TMyClass=class

IntField:Integer;

Constructor Create(а:integer);

Destructor Destroy;

end;

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

var a: ТСomp;

begin a.re:=0;{ошибка, объект пока не создан}

a:= ТСomp. Create; {создается объект a}

a.re:=0;

. . . . .

a. destroy; {уничтожение объекта}

end.

Обращение к деструктору объекта будет ошибочным, если объект не создан конструктором и если адрес объекта nil, поэтому для удаления объекта следует вызвать метод free, который сначала проверяет, не равен ли адрес объекта nil , а затем вызывает метод destroy.

Например: a. free; – уничтожение объекта.

Методы destroy, create есть и у общего предка всех классов TObject, поэтому если в классе-потомке не указан конструктор или деструктор, то он наследуется от общего класса-родителя.

Например:

type

Тcomp = class

re,im:real;

procedure input (x,y:real);

{конструктор и деструктор явно }

. . . . . { не указаны, они наследуются от класса TObject }

end;

procedure Тcomp.input;

begin re:=x;

im:=y;

end;

var a,b:Тcomp;

begin

a:= Тcomp.create; {вызывается конструктор}

a.input (6,10);

. . . . .

a.free {вызывается деструктор}

end.