Голосование

За какой срок реально продвинуть сайт в TOP-10 Yandex по НЧ запросу ?
 

Поиск по сайту

Предупреждение и примечание конструктора

Предупреждение

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

Примечание

Для конструкторов объекта предлагается использовать идентификатор Init.

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

var

FBee, GBee: Bee; { создать два экземпляра Bee }

begin

FBee.Init(5, 9) { вызов конструктора для FBee }

GBee := FBee; { Gbee недопустим! }

end;

Что же именно создает конструктор? Каждый тип объекта содержит нечто, называемое таблицей виртуального метода (ТВМ) в сегменте данных. ТВМ содержит размер типа объекта и для каждого виртуального метода указатель на код, выполняющий данный метод. Конструктор устанавливает связь между вызывающей его реализацией объекта и ТВМ типа объекта.

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

 
 Яндекс цитирования 2008 Soft-Uprating.Ru ©  Все права защищены.

Партнеры и друзья сайта
Ипотека в любой новостройке: коммерческая недвижимость. |yandex| игрушки angry birds