ООП, Обьекты и Классы

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Или путаница в терминологии?
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

zub писал(а):TObject вообщето класс а не объект. я имел ввиду ключевое слово OBJECT

То есть ключевое слово OBJECT создает экземпляр объекта?
По-моему это вы что=то путаете.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Код: Выделить всё

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/
Контактная информация:

Сообщение shade »

v-t-l
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.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

То есть, объявление переменной объекта неявно создает экземпляр, а переменной класса - не создает.

З.Ы. С объектами никогда плотно не общался, поэтому и ошибся. :oops:
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Тогда вопрос.
Для того чтобы манипулировать экземпляром объекта внутри какой-нибудь процедуры (не данного объекта), нужно ли передавать его через указатель или var-параметр?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

И еще - объявление переменной типа object создает не экземпляр, а область памяти нужного размера, забитую мусором. Чтобы там создать объект, нужно вызвать его конструктор. Автоматически он, в отличие от Си, не вызывается...
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Sergei I. Gorelkin
Спасибо.
compiler
новенький
Сообщения: 39
Зарегистрирован: 20.02.2007 12:49:12

Сообщение compiler »

Мне тоже надо сказать всем БОЛЬШОЕ спасибо.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Имеется объект:

Код: Выделить всё

AnyObj = object
  f1: Byte;
  ...
end;
var
  ao: AnyObj;
  b: Byte;

begin
  b := ao.f1;
end;

Как установить значение 5 в f1, чтобы b получила значение 5, если над объектом AnyObj еще никто не работал? Т.е. задать значение по умолчанию в поле f1.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

если над объектом AnyObj еще никто не работал? Т.е. задать значение по умолчанию в поле f1.

Никак.
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

Написать конструктор и в нём присвоить полю нужное значение.
Кстати, без создания экземпляра объекта приведенный код
вызовет AV (SIGSEGV)
Аватара пользователя
bw
постоялец
Сообщения: 359
Зарегистрирован: 01.12.2005 10:36:23
Откуда: Усть-Илимск
Контактная информация:

Сообщение bw »

> вызовет AV (SIGSEGV)
С какой стати? Мы ведь не путаем классы и объекты?!

..bw
Аватара пользователя
and
постоялец
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Сообщение and »

А как Object vs Class по накладным расходам? В частности, времени создания/разрушения и (менее критично) расходуемой памяти.
Точнее, интересует ^record vs ^Object vs Class.
С ^record всё ясно, с Class - тоже более-менее. А вот с ^Object пробел: не пользовался ими со времён TP7 - Borland, кажется, настоятельно рекомендовала не использовать одновременно Object и Class (абсолютно не помню, из каких соображений).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

В первом приближении их можно считать одинаковыми.
Ответить