Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Высокоуровневые методы информатики и программир...docx
Скачиваний:
25
Добавлен:
12.11.2019
Размер:
6.53 Mб
Скачать

Void __fastcall tForm1::Button1Click(tObject *Sender) // процедура

{struct stovar{int kt; char nt [20];} zstovar; // объявление переменной-записи

char str[30]; // создадим далее объект file и откроем создаваемый файл

TFileStream* file = new TFileStream(“spravtov.txt“,fmCreate); // открытие

stovar zst1={1, “масло крестьянское“}; // значения полей первой записи zst1

stovar zst2={2, “масло подсолнечное“};// значения полей второй записи zst2

file->Position=(zst1.kt-1)*sizeof(zst1); // установка на запись под номером kt

file->Write(&zst1,sizeof(zst1));//вывод записи zst1 под номером kt в spravtov

file->Position=(zst2.kt-1)*sizeof(zst2); // установка на запись под номером kt

file->Write(&zst2,sizeof(zst2));//вывод записи zst2 под номером kt в spravtov

delete file; // удаление объекта file c закрытием файла spravtov.txt

//создание объекта infile и открытие файла spravtov.txt для чтения

TFileStream* infile = new TFileStream(“spravtov.txt“,fmOpenRead);

Memo1->Clear(); // очистка объекта Memo1

while(infile->Read(&zstovar,sizeof(zstovar))>0) // цикл чтения записей

{ sprintf(str,“код: %d товар: %s“,zstovar.kt,zstovar.nt); // формирование str

Memo1->Lines->Add(str); // добавление строки str в массив строк Memo1

}delete infile; /*удаление объекта infile c закрытием файла spravtov.txt*/ }

6.6. Объектно‑ориентированное программирование

6.6.1. Создание классов и объектов

Оператор объявления класса имеет вид:

class <имя класса> : [<режим доступа>] <имя родительского класса>

{[private: <поля, методы, свойства и события, доступные только в классе>]

[protected: <аналогичен private, и дополнительно доступный потомкам>]

[public: <поля, методы, свойства и события, доступные всем >]

[_published: <аналогичен public и изменяемый в Инспекторе Объектов>]

[friend <дружественные функции>]

}; //окончание объявления класса

Режим доступа задается словами: private/public (защищенные имена остаются защищенными, а общедоступные имена родительского класса недоступны/доступны в производном классе).

По умолчанию имя родительского класса TObject (наиболее общий предопределенный класс). Класс наследует поля, свойства, методы и события своих предков и может их изменять или вводить новые.

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

Объект объявляется в разделе переменных оператором вида:

<имя класса> <имя объекта>;

Доступ к полям, свойствам и методам объекта реализуется указа­нием имени объекта, стрелочки (->) и имени поля, свойства или метода.

Пример задания значения свойству Caption объекта Button1:

Button1->Caption:=”Выход”; //надпись командной кнопки “Выход”

Конструктор/деструктор ‑ специальные методы, создающие/ун­ич­тожающие объекты. Они отличаются от обычных методов следующими осо­бенностями: имеют имя, совпадающее с именем своего класса (у дес­трук­­тора перед именем указывается символ тильда “~”); автоматически вы­зы­вают­ся компилятором; не имеют возвращаемого зна­че­ния, не могут нас­ле­до­вать­ся, хотя могут вызываться из производного класса; по умол­ча­нию имеют атрибут public; конструкторы не могут быть виртуальными.

Конструкторы бывают трех типов:

конструктор по умолчанию не имеет параметров, и при его явном отсут­ст­вии в классе создается автоматически компилятором;

конструктор с параметрами позволяет в момент создания объекта вы­зы­вать различные функции и передавать им значения через параметры;

конструктор копирования позволяет создавать новый объект путем ко­пи­рования из другого существующего объекта этого класса (формирова­ние динамических структур).

Операция доступа к области действия (::) задается в виде:

:: <имя глобальной переменной> или <имя класса>::<имя функции>

Первая форма позволяет обратиться к глобальной переменной, если она даже закрыта одноименой локальной переменной (::x:=12.6).

Вторая форма обозначает, что функция, хотя и определена вне ука­зан­ного класса, является методом данного класса и существует в области дей­ствия этого класса (TForm1::Button1Click(TObject *Sender)).

Пример создания и использования классов: Circle (вывод данных о круге) и производного из него класса Cylinder (вывод данных о цилиндре).

const double pi=3.14159265358979; // объявление константы pi

class Circle // объявление класса Circle ‑ вывода радиуса и площади круга

{ protected: double r; // объявление переменной со значением радиуса круга

public: // общедоступные методы и переменные класса Circle

Circle(double rVal=0) // заголовок конструктора класса с параметром rVal

: r(rVal) // при создании объекта Circle значению r присваивается rVal

{ }// пустое тело метода; можно было и так: Circle(double rVal=0){r=rVal;}

void setRadius(double rVal) {r=rVal;} // метод установки значения r

double getRadius() {return r;} // метод возвращения значения радиуса r

double Area() {return pi*r*r;} // метод вычисления площади круга

void showData(); // объявление метода вывода данных о круге

}; // окончание объявления класса Circle

// объявление производного класса Cylinder из класса Circle

class Cylinder: public Circle // класс Cylinder выводит данные о цилиндре

{protected:double h; //объявление переменной h‑значение высоты цилиндра

public: // общедоступные методы и переменные класса Cylinder

Cylinder (double hVal=0, double rVal=0) // заголовок конструктора класса

: h(hVal),// при создании объекта Cylinder значению h присваивается hVal

Circle(rVal){ } // вызов конструктором класса Cylinder конструктора Circle

void setHeight(double hVal) {h=hVal;} // метод установки значения h

double getHeight () {return h;} // метод, возвращающий значение h

// метод вычисления поверхности цилиндра. Circle::Area() перезагружает

//унаследованную функцию класса Circle для вычиcления площади

//основания цилиндра.

double Area() {return 2*Circle::Area()+2*pi*r*h;} // площадь цилиндра

void showData(); // объявление метода вывода данных о цилиндре

}; // окончание объявления класса Cylinder

void Circle::showData() // заголовок метода в Circle вывода данных о круге

{cout << “Радиус круга = “<<getRadius()<<endl // вывод значения радиуса

<< “Площадь круга = “<< Area()<<endl <<endl; // вывод площади круга

} // конец метода Circle::showData

void Cylinder::showData() // метод в Cylinder вывода данных о цилиндре

{cout << “Радиус основания = “ << getRadius() << endl // вывод радиуса

<< “Высота цилиндра = “<< getHeight() << endl // вывод высоты

<< “Площадь поверхности=“<< Area() << endl; // вывод площади

} // конец метода Cylinder::showData

int main(int argc,char **argv) // основная процедура тестирования классов

{Circle circle(4); // создания объекта circle класса Circle (круг радиусом 4)

Cylinder cylinder(9,3);//создания объекта cylinder класса Сylinder (цилиндр)

circle.showData(); // вывод данных о круге методом showData класса circle

cylinder.showData();// вывод данных о цилиндре методом cylinder.showData

getch(); return 0; // остановка и завершение работы функции

} // конец функции тестирования классов и объектов