Конструктор и деструктор
В Delphi объект — это динамическая структура. Переменная-объект содержит не данные, а ссылку на данные объекта. Поэтому программист должен позаботиться о выделении памяти для этих данных.
Выделение памяти осуществляется при помощи специального метода класса (процедуры) — конструктора, которому обычно присваивают имя Create (создать). Для того чтобы подчеркнуть особую роль и поведение конструктора, в описании класса вместо слова procedure используется слово constructor.( по синтаксису языка PascalABC и Object Pascal и Delphi)
Ниже приведено описание класса TPerson, в состав которого введен конструктор:
type TPerson = class
private
fname: string [ 15 ];
faddress: string[35];
f_age: integer;
constructor Cireate; // конструктор
public
procedure show; // метод
end;
constructor TPerson.Create;
begin
fname := '';
faddress := '';
f_age:=0;
end;
var
professor: TPerson;
Например, после выполнения инструкции
professor := TPerson.Create;
-выделяется необходимая память для всех данных объекта professor и им присваиваются пустые строки. (Инициализация)
Помимо выделения памяти, конструктор, как правило, решает задачу присваивания полям объекта начальных значений, т. е. осуществляет инициализацию объекта.
Пример 2,
constructor ТStudent.Create(nm: string; c,gr: integer); begin name:=nm; course:=c; group:=g; end;
var
stud1, stud2 : Тstudent;
……………
Stud1:=TStudent.Create('Иванов',1,3);
stud2:=TStudent.Create; // инициализация пустыми и нулевыми полями
После объявления и инициализации объект можно использовать, например, установить значение поля объекта. Доступ к полю осуществляется указанием имени объекта и имени поля, которые отделяются друг от друга точкой.
Например, для доступа к полю fname объекта professor надо написать
professor.fname:=’ Сидоров‘ ;
Пример 2,
stud1.name:='Синичкин';
Если в программе какой-либо объект больше не используется, то можно освободить память, занимаемую полями данного объекта. Для выполнения этого действия используют метод-деструктор Free.
? destructor TStudent.Destroy;
begin
???
end;
Например, для того, чтобы освободить память, занимаемую полями объекта professor, достаточно записать professor.Free;
stud1.Destroy;
professor..Destroy;
МЕТОД
Методы класса – это процедуры и функции, объявление которых включено в описание класса. Они выполняют действия над объектами класса.
Для того чтобы метод был выполнен (вызвать процедуру), необходимо указать имя объекта и имя метода, отделив одно имя от другого точкой. Например, инструкция
professor. Show;
- вызывает применение метода show к объекту professor.
Пример 2,
stud2.print;
stud2.nextCourse;
Методы класса объявляются в программе точно так же, как и обычные процедуры и функции, за исключением того, что имя процедуры или функции, являющейся методом, состоит из двух частей: имени класса, к которому принадлежит метод, и имени метода. Имя класса от имени метода отделяется точкой.
Ниже приведен пример определения метода show класса TPerson
// метод Show класса TPerson
procedure TPerson.Show;
begin
ShowMessage( 'Имя:' + fname + #13
+ 'Адрес:' + faddress +#13+’возраст:’ + f_age);
end;
или Пример 2,
procedure TStudent.Print;
begin
writeln('Имя:',name,' курс:',course,' группа:',group);
end;
procedure TStudent.NextCourse;
begin
Inc(course);
end;
Примечание: В инструкциях метода ( в описании процедуры) доступ к полям объекта осуществляется без указания имени объекта.
type
Student=class
name: string;
course: integer;
group: integer;
constructor Create(nm: string; c,gr: integer);
destructor Destroy;
procedure Print;
procedure NextCourse;
end;
constructor Student.Create(nm: string; c,gr: integer);
begin
name:=nm;
//course:=c;
if (C < 0) or (c>5) then
begin
WriteLn('...Некорректно задан курс (', c, ')!');
course := 0;
end
else course:=C;
group:=gr;
end;
procedure Student.Print;
begin
writeln('Имя:',name,' курс:',course,' группа:' ,group);
end;
procedure Student.NextCourse;
begin
Inc(course); // course;=course+1;
end;
destructor Student.Destroy;
begin
WriteLn('...Вызван деструктор класса Student - ...уничтожается объект класса ');
end;
var
s1,s2: Student;
M : Real;
begin
WriteLn('Лабораторная работа №2');
s1 := student.Create;
s1.Print;
s2 := student.Create('BATYA',1,2);
s2.Print;
end.
type
CComplex = class //(TObject)
Re : Real;
Im : Real;
end;
var
MyObject : CComplex;
M : Real;
begin
WriteLn('Лабораторная работа №1');
WriteLn('Задача 1. Класс CComplex.');
MyObject := CComplex.Create;
WriteLn;
WriteLn('Введите действительную и мнимую части ',
'комплексного числа:');
ReadLn( MyObject.Re, MyObject.Im );
WriteLn;
M := sqrt(sqr(MyObject.Re) + sqr(MyObject.Im));
WriteLn('Модуль комплексного числа равен ', M : 8 : 3);
MyObject.Destroy;
end.
type
CComplex = class //(TObject)
Re : Real;
Im : Real;
function Abs : Real;
constructor Create;
destructor Destroy;
end;
function CComplex.Abs : Real;
var
Res:Real;
begin
WriteLn('...Вызван метод Abs класса Complex');
WriteLn('...вычисляется модуль комплексного числа.');
Res := sqrt ( sqr(Re) + sqr(Im) );
Abs := Res
end;
constructor CComplex.Create;
begin
WriteLn('...Вызван конструктор класса CComplex -');
WriteLn('...создается объект класса CComplex.')
end;
destructor CComplex.Destroy;
begin
WriteLn('...Вызван деструктор класса CComplex - ...уничтожается объект класса CComplex.');
end;
var
MyObject : CComplex;
M : Real;
begin
WriteLn('Лабораторная работа №1');
WriteLn('Задача 2. Метод Abs() класса CComplex.');
MyObject := CComplex.Create; //- вызов стандартных функций
WriteLn;
WriteLn('Введите действительную и мнимую части ',
'комплексного числа:');
ReadLn( MyObject.Re, MyObject.Im );
WriteLn;
M := sqrt(sqr(MyObject.Re) + sqr(MyObject.Im));
WriteLn('Модуль комплексного числа равен ', M : 8 : 3);
WriteLn('Оператор M := MyObject.Abs(); ');
M := MyObject.Abs;
WriteLn('Модуль, вычисленный методом Abs, равен ', M:8:3);
MyObject.Destroy; //вызов стандартных процедур
end.
type Digit=class
x,y:real;
function sum:real;
function Razn_k(k:integer):real;
Constructor Create (xx,yy:real);
//Destructor Destroy ;
end;
function Digit.sum:real;
begin
sum:=x+y;
end;
function Digit.Razn_k(k:integer):real;
begin
razn_k:= power(x-y,k);
end;
Constructor Digit.Create (xx,yy:real);
begin
if xx>0 then x:=xx;
if yy>0 then y:=yy;
end;
//Destructor Digit.Destroy ;
var para1,para2: Digit;
s1,vr1:real;
begin
para1:= Digit.Create(4,23) ;
writeln(para1.x,' ', para1.y);
s1:=para1.sum;
writeln(s1);
s1:=para1.razn_k(5);
writeln(s1);
end.
Пример 3, описание метода Button1Click будет выглядеть так:
interface
type
TForml = class(TForm)
Buttonl: TButton;
procedure Button1Click(Sender: TObject);
end;
implementation
procedure TForml.Button1Click(Sender: TObject);
begin
Close;
end;……..
