The thing to keep in mind is:
Any type that is a pointer type does NOT allocate memory for whatever the pointer points to. For instance, in the code:
type
PMyRecord = ^TMyRecord;
TMyRecord = record
SomeField : integer;
end;
var
VRecordPointer : PMyRecord; // does NOT reserve memory for a TMyRecord
VRecordVariable : TMyRecord; // reserves memory for a TMyRecord
The declaration VRecordPointer reserves memory to hold a pointer to a TMyRecord, it does NOT reserve memoy for a TMyRecord itself.
The declaration VRecordVariable reserves memory to hold a TMyRecord because the variable is a TMyRecord not just a pointer to it.
Now, in the code:
type
TMyClass = class
X, Y : integer;
end;
var
VMyClass : TMyClass;
A class type is a
pointer type, just like PMyRecord is a pointer type. Unfortunately, this fact is "hidden" by the compiler, presumably for programmer's convenience. You can think of the word "class" as being an abbreviation for "pointer to record laid out as follows:"
Therefore the declaration "VMyClass : TMyClass";" is declaring a _pointer_ to the structure/record.
You can think of it this way, in a single declaration, a class declares a pointer to the record and its structure. This is unlike with records which _require_ declaring the pointer and the structure separately.
Since a class is just a pointer to something, that's why it needs an additional step to reserve memory for it (usually by a Create method.) The "var" declaration reserves memory for a pointer of that class, the "Create" call reserves memory to hold the structure the class points to.
HTH.