Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа 2012 / ВВЕДЕНИЕ В ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ.doc
Скачиваний:
52
Добавлен:
07.06.2015
Размер:
184 Кб
Скачать
☆

Конструктор и деструктор

В 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;……..