Введение в объектно-ориентированное программирование на языке Object Pascal. Соколов Е.В. - 29 стр.

UptoLike

Составители: 

29
содержащие результаты вычислений, присваиваются заранее
объявленным, но не инициализированным переменным ra, rs, rm и rd. }
WriteLn('Plus: ',ra.GetNum,'/',ra.GetDen);
WriteLn('Minus: ',rs.GetNum,'/',rs.GetDen);
WriteLn('Dot: ',rm.GetNum,'/',rm.GetDen);
WriteLn('Slash: ',rd.GetNum,'/',rd.GetDen);
ra.Add(r2); //
rs.Subtract(r2); // теперь к объектам, созданным ранее,
rm.MultiplyBy(r2); // применяются операторы с присвоением
rd.DivideBy(r2); //
WriteLn('Add: ',ra.GetNum,'/',ra.GetDen);
WriteLn('Sub: ',rs.GetNum,'/',rs.GetDen);
WriteLn('Mul: ',rm.GetNum,'/',rm.GetDen);
WriteLn('Div: ',rd.GetNum,'/',rd.GetDen);
r1.Destroy; r2.Destroy;
{ Функции Plus, Minus, Dot и Slash возвращают указатель
на уже созданный объект, поэтому заранее размещать
в памяти переменные ra, rs, rm и rd не требовалось.
Однако уничтожить их по завершении программы необходимо. }
ra.Destroy; rs.Destroy; rm.Destroy; rd.Destroy;
ReadLn;
end.
Заметим , что в этой программе, в отличие от приведенной в § 1.2,
непосредственное обращение к полям переменных уже невозможно, по-
этому всюду используются вызовы методов Get¼ и Set¼ Другим важ-
ным отличием являе т ся явное создание и удаление объектов , в том числе
и тех, которые появились в процессе работы подпрограмм модуля.
Вообще, при работе с функциями, возвращающими ссылки на
объекты, очень легко допустить утечку памяти. Рассмотрим в качестве
примера инструкцию
sum:=r1.Plus(r2).Plus(r3);
где r1, r2, r3 и sum объектные переменные класса Rational, причем r1,
r2 и r3 уже с одержат адреса реальных объектов .
Использование данного выражения не только не является пред -
осудительным, но даже наоборот , поощряется объектным синтаксисом . К
объекту r1 применяется метод Plus с параметром r2, возвращающий
ссылку на новый объ ект класса Rational (назовем его temp), содержащий
сумму чисел r1 и r2. Затем к объекту temp снова применяется метод Plus с
параметром r3. Результатом его выполнения является ссылка еще на один
объект все того же класса, которая и присваивается переменной sum.
  содержащие результаты вычислений, присваиваются заранее
  объявленным, но не инициализированным переменным ra, rs, rm и rd. }

  WriteLn('Plus: ',ra.GetNum,'/',ra.GetDen);
  WriteLn('Minus: ',rs.GetNum,'/',rs.GetDen);
  WriteLn('Dot:    ',rm.GetNum,'/',rm.GetDen);
  WriteLn('Slash: ',rd.GetNum,'/',rd.GetDen);
  ra.Add(r2);         //
  rs.Subtract(r2);    // теперь к объектам, созданным ранее,
  rm.MultiplyBy(r2); // применяются операторы с присвоением
  rd.DivideBy(r2);    //
  WriteLn('Add: ',ra.GetNum,'/',ra.GetDen);
  WriteLn('Sub: ',rs.GetNum,'/',rs.GetDen);
  WriteLn('Mul: ',rm.GetNum,'/',rm.GetDen);
  WriteLn('Div: ',rd.GetNum,'/',rd.GetDen);
  r1.Destroy; r2.Destroy;

{ Функции Plus, Minus, Dot и Slash возвращают указатель
  на уже созданный объект, поэтому заранее размещать
  в памяти переменные ra, rs, rm и rd не требовалось.
  Однако уничтожить их по завершении программы необходимо. }

  ra.Destroy; rs.Destroy; rm.Destroy; rd.Destroy;
  ReadLn;
end.


        Зам ет им , чтов э той програм м е, в отл ичие от прив ед енной в § 1.2,
непос ред с т в енное обращение к пол ям перем енны хуже нев оз м ожно, по-
э том у в с юд у ис пол ь з уют с я в ы з ов ы м етод ов Get¼ и Set¼ Другим в аж-
ны м отл ичием яв л яет с я яв ное с оз д ание и уд ал ение объектов , в том чис л е
и т ех, которы е появ ил ис ь в процес с е работ ы под програм м м од ул я.
           Вообще, при работ е с функциям и, в оз в ращающим и с с ы л ки на
   объект ы , очень л егко д опус т ит ь ут ечку пам ят и. Рас с м от рим в качес т в е
   прим ера инс т рукцию
                           sum:=r1.Plus(r2).Plus(r3);
   гд е r1, r2, r3 и sum — объект ны е перем енны е кл ас с а Rational, причем r1,
   r2 и r3 уже с од ержат ад рес а реал ь ны хобъектов .
             И с пол ь з ов ание д анного в ы ражения не тол ь ко не яв л яет с я пред -
   ос уд ит ел ь ны м , нод аже наоборот, поощряет с я объект ны м с инт акс ис ом . К
   объект у r1 прим еняет с я м етод Plus с парам ет ром r2, в оз в ращающий
   с с ы л ку на нов ы й объект кл ас с а Rational (наз ов ем егоtemp), с од ержащий
   с ум м у чис ел r1 и r2. Зат ем к объект у temp с нов а прим еняет с я м етод Plus с
   парам ет ром r3. Рез ул ьт атом егов ы пол нения яв л яет с я с с ы л ка еще на од ин
   объект в с е того же кл ас с а, которая и прис в аив ает с я перем енной sum.

                                           29