ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 27
- 28
- 29
- 30
- 31
- …
- следующая ›
- последняя »
