АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Когда начинается работа с объектом, то он размещается в памяти

Читайте также:
  1. A) условие равновесия на денежном рынке, когда с ростом дохода повышается процентная ставка
  2. II. Работа в базе данных Microsoft Access
  3. II. Работа с лексическим составом языка
  4. II. Работа с текстом
  5. IV. Культурно-просветительская работа.
  6. IV. Работа с текстом
  7. S: Ситуация, когда на рынке имеется только один покупатель, называется ###.
  8. S: Ситуация, когда на рынке имеется только один покупатель, называется ###.
  9. V1: Договорная работа с поставщиками и посредниками
  10. When in doubt - choose Pastlndf. Когда сомневаетесь - выбирайте Pastlndf.
  11. Автором опыта выделен алгоритм формирования умения работать с моделями.
  12. Безопасность при погузочно-разгрузочных работах.

 

Чтобы сконструировать объект (выделить память для экземпляра):

 

Reader := TDelimitedReader.Create;

 

Create — это конструктор объекта; он всегда присутствует в классе и служит для создания и инициализации экземпляров. При создании объекта в памяти выделяется место только для его полей. Методы, как и обычные процедуры и функции, помещаются в область кода программы; они умеют работать с любыми экземплярами своего класса и не дублируются в памяти.

 

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

Reader.NextLine;

 

Кроме того, как и при работе с записями, допустимо использование оператора with, например:

 

with Reader do NextLine;

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

 

Reader.Destroy; // Освобождение памяти, занимаемой объектом

Destroy – это деструктор объекта; он присутствует в классе наряду с конструктором и служит для удаления объекта из динамической памяти. После вызова деструктора переменная Reader становится несвязанной и не должна использоваться для доступа к полям и методам уже несуществующего объекта. Чтобы отличать в программе связанные объектные переменные от несвязанных, последние следует инициализировать значением nil.

 

Reader := nil;

...

if Reader <> nil then

Reader.Destroy;

 

Вызов деструктора для несуществующих объектов недопустим и при выполнении программы приведет к ошибке. Чтобы избавить программистов от лишних ошибок, в объекты ввели предопределенный метод Free, который следует вызывать вместо деструктора. Метод Free сам вызывает деструктор Destroy, но только в том случае, если значение объектной переменной не равно nil.

if Reader <> nil then ~ Reader.Free

Reader.Destroy

 

После уничтожения объекта переменная Reader сохраняет свое значение, продолжая ссылаться на место в памяти, где объекта уже нет. Если эту переменную предполагается еще использовать, то желательно присвоить ей значение nil, чтобы программа могла проверить, существует объект или нет.



Reader.Free; ~ FreeAndNil(Reader);

Reader := nil;

Значение одной объектной переменной можно присвоить другой. При этом объект не копируется в памяти, а вторая переменная просто связывается с тем же объектом, что и первая:

 

var

R1, R2: TDelimitedReader; // Переменные R1 и R2 не связаны с объектом

begin

R1 := TDelimitedReader.Create; // Связывание переменной R1 с новым объектом

// Переменная R2 пока еще не связана ни с каким объектом

R2 := R1; // Связывание переменной R2 с тем же объектом, что и R1

// Теперь обе переменные связаны с одним объектом

R2.Free; // Уничтожение объекта

// Теперь R1 иR2 не связаны ни с каким объектом

end;

Создание объекта включает выделение памяти под экземпляр и инициализацию его полей, а разрушение – очистку полей и освобождение памяти. Действия по инициализации и очистке полей специфичны для каждого конкретного класса объектов. По этой причине Delphi позволяет переопределить стандартный конструктор Create и стандартный деструктор Destroy для выполнения любых полезных действий. Можно даже определить несколько конструкторов и деструкторов (имена им назначает сам программист), чтобы обеспечить различные процедуры создания и разрушения объектов.

 

type

TDelimitedReader = class

...

Constructor Create(const FileName: string; const ADelimiter: Char = ';');

Destructor Destroy; override;

...

end;

 

constructor TDelimitedReader.Create( const FileName: string;

const ADelimiter: Char = ';');

begin

AssignFile(FileVar, FileName);

Delimiter := ADelimiter;

end;

destructor TDelimitedReader.Destroy;

begin

end;

 

Если объект содержит встроенные объекты или другие динамические данные, то конструктор – это как раз то место, где их нужно создавать.

Конструктор применяется к классу или к объекту.

Если он применяется к классу,

‡агрузка...

 

Reader := TDelimitedReader.Create('MyData.del', ';');

 

то выполняется следующая последовательность действий:

1) в динамической памяти выделяется место для нового объекта;

2) выделенная память заполняется нулями. В результате все числовые поля и поля порядкового типа приобретают нулевые значения, строковые поля становятся пустыми, а поля, содержащие указатели и объекты получают значение nil;

3) затем выполняются заданные программистом действия конструктора;

4) ссылка на созданный объект возвращается в качестве значения конструктора. Тип возвращаемого значения совпадает с типом класса, использованного при вызове.

 

Если конструктор применяется к объекту,

Reader.Create('MyData.del', ';');

 

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

 

Деструктор уничтожает объект, к которому применяется:

 

Reader.Destroy;

 

В результате:

1) выполняется заданный программистом код завершения;

2) освобождается занимаемая объектом динамическая память.

 

В теле деструктора обычно должны уничтожаться встроенные объекты и динамические данные, как правило, созданные конструктором. Как и обычные методы, деструктор может иметь параметры, но эта возможность используется редко.

 

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

 

В конце деструктора, вы должны вызвать Inherited для вызова родительского деструктора.

 

Пример, что деструктор явно можно не вызывать:

procedure TForm1.FormCreate(Sender:Object);

var
words : TWords;

begin
words := TWords.Create(4);
end;


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |


При использовании материала, поставите ссылку на Студалл.Орг (0.01 сек.)