ООП, Обьекты и Классы
Модератор: Модераторы
Код: Выделить всё
type
TObj=object
..........
end;
TClass=class
..........
end;
var
v1:TObj;
v2:TClass;после создания переменных
v1-экземпляр типа TObj
v2-указатель на экземпляр типа TClass
собственно в этом и разница между объектами и классами. плюс в классы еще сразу встроенно некоторое количество фич благодаря наследованию от TObject
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
v-t-l
RTFM
RTFM
Код: Выделить всё
type
TMyObject = object
public
x: Integer;
end;
var obj1, obj2: TMyObject;
begin
obj1.x := 10;
obj2 := obj1;
obj2.x := 20;
writeln(obj1.x);
writeln(obj2.x);
end.- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Нужно. Объект ведет себя точно так же, как и запись. Если передавать по значению, то в вызываемой процедуре будет создана локальная копия, и все изменения произойдут в ней, а не в исходном объекте.
И еще - объявление переменной типа object создает не экземпляр, а область памяти нужного размера, забитую мусором. Чтобы там создать объект, нужно вызвать его конструктор. Автоматически он, в отличие от Си, не вызывается...
И еще - объявление переменной типа object создает не экземпляр, а область памяти нужного размера, забитую мусором. Чтобы там создать объект, нужно вызвать его конструктор. Автоматически он, в отличие от Си, не вызывается...
Имеется объект:
Как установить значение 5 в f1, чтобы b получила значение 5, если над объектом AnyObj еще никто не работал? Т.е. задать значение по умолчанию в поле f1.
Код: Выделить всё
AnyObj = object
f1: Byte;
...
end;
var
ao: AnyObj;
b: Byte;
begin
b := ao.f1;
end;Как установить значение 5 в f1, чтобы b получила значение 5, если над объектом AnyObj еще никто не работал? Т.е. задать значение по умолчанию в поле f1.
если над объектом AnyObj еще никто не работал? Т.е. задать значение по умолчанию в поле f1.
Никак.
Написать конструктор и в нём присвоить полю нужное значение.
Кстати, без создания экземпляра объекта приведенный код
вызовет AV (SIGSEGV)
Кстати, без создания экземпляра объекта приведенный код
вызовет AV (SIGSEGV)
А как Object vs Class по накладным расходам? В частности, времени создания/разрушения и (менее критично) расходуемой памяти.
Точнее, интересует ^record vs ^Object vs Class.
С ^record всё ясно, с Class - тоже более-менее. А вот с ^Object пробел: не пользовался ими со времён TP7 - Borland, кажется, настоятельно рекомендовала не использовать одновременно Object и Class (абсолютно не помню, из каких соображений).
Точнее, интересует ^record vs ^Object vs Class.
С ^record всё ясно, с Class - тоже более-менее. А вот с ^Object пробел: не пользовался ими со времён TP7 - Borland, кажется, настоятельно рекомендовала не использовать одновременно Object и Class (абсолютно не помню, из каких соображений).
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
В первом приближении их можно считать одинаковыми.
