6.3 Экземпляр класса

На верх  Назад  Вперёд

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

ClassVar := ClassType.ConstructorName;

Расширенный синтаксис new и dispose не может быть использован для создания и уничтожения экземпляра класса. Это конструкции зарезервированы для использования только с объектами. Вызов конструктора спровоцирует вызов метода виртуального класса NewInstance, который, если не изменена реализация по умолчанию, вызывает GetMem, чтобы выделить место, достаточное для хранения данных экземпляра класса, а затем очистить память.

После этого выполняется код конструктора. Конструктор имеет указатель на свои данныe, в Self.

Замечание:

Директива {$PackRecords} также влияет на классы, то есть выравнивание в памяти различных полей зависит от значения директивы {$PackRecords}.

Так же, как для объектов и записей,  может быть объявлен packed class (упакованный класс). Это имеет тот же эффект, что и на объект, или запись, а именно, что элементы выровнены по границам 1 байт, то есть как можно ближе.

Функция SizeOf(класс) возвращает то же самое, что и SIZEOF(Указатель), так как класс является указателем на объект. Чтобы получить размер данных экземпляра класса, используйте метод TObject.InstanceSize.

Если во время выполнения конструктора происходит исключение, автоматически вызывается деструктор.