Шаг 131.
Конструкторы

    На этом шаге мы рассмотрим правила использования конструкторов.

    Конструктор - это метод особого вида, который создает объекты и делает для них начальные установки. Заголовок конструкторов начинается с ключевого слова constructor.

    Отметим, что в качестве имен конструкторов, в отличие от Borland Pascal, в котором применялся идентификатор Init, в Object Pascal рекомендуется использовать идентификатор Create.


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

    Первый способ вызова использовался и ранее в Borland Pascal, a второй способ добавлен по той причине, что конструктор в Object Pascal выполняет не только инициализацию, но и создание объектов. Как было рассмотрено выше, все объекты в Object Pascal являются потомками класса TObject и, соответственно этому, наследуют базовый вариант конструктора Create, который описан в этом классе. Следовательно, если для создания объекта какого-либо класса достаточно только стандартных действий, то в этом классе конструктор можно не объявлять, а вызывать наследуемый из TObject.

type
  TSimpleClass  =  class 
    FField   :   Integer; 
    property  Simple : Integer read FField write  FField; 
  end; 

var
  SimpleVar  :  TSimpleClass;

implementation
      .    .    .    .
  SimpleVar  :=  TSimpleClass.Create; 
  SimpleVar.Simple := 10; 
  SimpleVar.Free;

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

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

    SimpleVar := TSimpleClass.Create;

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

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

    SimpleVar.Create;
           или 
    inherited Create;

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

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

    На следующем шаге мы поговорим о деструкторах.




Предыдущий шаг Содержание Следующий шаг