А вообще фееричный тред.
Напомню, object это старый тип, переменные этого типа могли располагаться как на стеке так и в куче. В отличие от крестов деструкторы там автоматически не вызывались (хотя память, выделенная на стеке, освобождается). Кстати, конструктор и деструктор были не обязательны, если не было виртуальных методов. Для создания объекта в куче использовался расширенный синтаксис new и dispose, примерно так
- Код: Выделить всё
type PMyObject = ^TMyObject;
TMyObject = object
...
constructor Init;
destructor Done;
end;
var p: PMyObject;
...
//так
p:=new(PMyObject, Init);
//или так
new(p, Init);
//уничтожение
dispose(p, Done);
При обращении к элементам класса разыменовывание происходит автоматически (если стоит соответствующий ключ компилятора).Иначе надо писать, примерно так.
- Код: Выделить всё
p^.MyMethod();
Этот тип не поддерживает интерфейсы и считается устаревшим, вместо него следует использовать class. Переменные этого типа, по сути, являются типизированными указателями, а сами объекты ВСЕГДА! располагаются в куче. Кроме того, вся иерархия объектов происходит от специального, встроенного класса TObject.
Обращаю внимание, все классы являются дочерними по отношению к встроенному в компилятор классу TObject.
Кроме этого, есть еще несколько типов, которые скрывают свою сущность указателя, кроме классов это некоторые строки, динамические массивы и интерфейсы. Они также автоматически разыменовываются и не только!
Добавлено спустя 6 минут 35 секунд:Да и еще по поводу передачи параметров, для классов, динамических массивов, строк (не все), интерфейсов передаются ссылки. Для типов со счетчиком ссылок он может изменяться в зависимости от типа параметра. По поводу присваивания... вопрос сложный... обычно просто копируется ссылка, но иногда происходит копирование.