Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота4.doc
Скачиваний:
2
Добавлен:
18.11.2019
Размер:
101.38 Кб
Скачать

Лабораторна робота 4

Тема. Створення конструкторів та деструкторів на мові С++ у середовищі С++ Builder

Мета. Одержати практичні навички програмування з використанням конструкторів та деструкторів класу

Теоретичні відомості

В С++ передбачена можливість оголосити спеціальну функцію, що має явне призначення – ініціалізацію об’єктів. Оскільки така функція створює (конструює) значення даного типу, то вона називається конструктором. Конструктор розпізнається за ім’ям, яке збігається із назвою самого класу. Клас може містити будь-яку кількість конструкторів, або не містити жодного. Існує три види конструкторів:

  • Конструктор за замовчуванням не має параметрів. Якщо клас не містить жодного конструктора, то компілятор автоматично створить один конструктор за замовчуванням, який просто виділяє пам’ять при створенні об’єкта свого класу.

  • Конструктор з параметрами дозволяє ініціалізувати об’єкт у момент його створення – викликати різні функції, виділяти динамічну пам’ять, присвоювати змінним початкові значення і т.п.

  • Конструктор копіювання (генератор копій) призначений для створення об’єктів даного класу шляхом копіювання даних з іншого, вже існуючого об’єкта цього класу. Такі конструктори особливо доцільні для створення копій об’єктів, що моделюють динамічні структури даних

Конструктори ініціалізують об’єкт, тобто вони створюють середовище, у якому працюють функції-члени. Іноді створення такого середовища передбачає виділення ресурсів (файл, пам’ять), що повинні бути звільнені після їхнього використання. Тому деяким класам потрібна функція, яка буде викликатись при знищенні об’єкта. Такі функції називаються деструкторами. Вони очищують пам’ять і звільняють ресурси. Деструктори викликаються неявно. Коли автоматична змінна виходить з області видимості, звільняється об’єкт, що зберігається у вільній пам’яті і т.д.

Деструктор – це функція-член класу, що не має параметрів і не повертає значення. Ім’я деструктора складається із символу ~ (тильда) та імені класу. Клас повинен містити лише один деструктор. Деструктор не може приймати аргументів.

Приклад виконання завдання

Завдання:

Дано базовий клас банк та похідний клас вкладник. Реалізувати конструктори для ініціалізації закритих членів базового та похідного класів; методи пошуку за кодом та прізвищем вкладника.

Вікно виконання програми наведено на рис. 1.

Текст програми

Створено базовий клас TBank та похідний TVkladnuk, які містять у закритій частині відомості про банк та вкладника відповідно. Використано функції пошуку за кодом та прізвищем вкладника у похідному класі.

Файл заголовків:

#include "Unit1.h"

class TBank

{

protected:

String Name_bank;

float Id_bank;

public:

void Input();

TBank(String s, float d)

{

Name_bank = s;

Id_bank = d;

};

~TBank(){};

};

//---------------------------------------------------------------------------

class TVkladnuk : public TBank

{

float Id_kod;

String Pasport;

String Name;

float Vklad;

public:

void Input(int St, int Cl);

void Search_kod (float);

void Search_name (String);

TVkladnuk(String s, float d, float k, String p, String n, float v):TBank("", 0)

{

TBank::Name_bank = s;

TBank::Id_bank = d;

Id_kod = k;

Pasport = p;

Name = n;

Vklad = v;

};

~TVkladnuk(){};

};

Текст файлу реалізації подано нижче.

TForm1 *Form1;

TVkladnuk *Vk[20];

TStringList *Spisok = new TStringList;

int k=0; int k1=0;

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Vkladnuk->Cells[0][0] = "Назва банку";

Vkladnuk->Cells[1][0] = "Реквізити банку";

Vkladnuk->Cells[2][0] = "Код вкладника";

Vkladnuk->Cells[3][0] = "Паспортні дані вкладника";

Vkladnuk->Cells[4][0] = "ПІП вкладника";

Vkladnuk->Cells[5][0] = "Розмір вкладу";

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

for(int i = 1; i<Form1->Vkladnuk->RowCount;i++)

for(int j = 0; j<Form1->Vkladnuk->ColCount;j++)

Form1->Vkladnuk->Cells[j][i] = "";

switch (RadioGroup1->ItemIndex)

{

case 0: for(int i = 1; i<Form1->Vkladnuk->RowCount-1;i++)

Vk[i]->Search_kod(StrToFloat(Edit1->Text));

case 1: for(int i = 1; i<Form1->Vkladnuk->RowCount;i++)

Vk[i]->Search_name(Edit1->Text);

}

}

//---------------------------------------------------------------------------

void TVkladnuk :: Search_kod(float n)

{

if (Id_kod == n)

{

k++;

Form1->Vkladnuk->Cells[0][k] = Name_bank;

Form1->Vkladnuk->Cells[1][k] = Id_bank;

Form1->Vkladnuk->Cells[2][k] = Id_kod;

Form1->Vkladnuk->Cells[3][k] = Pasport;

Form1->Vkladnuk->Cells[4][k] = Name;

Form1->Vkladnuk->Cells[5][k] = Vklad;

}

}

//---------------------------------------------------------------------------

void TVkladnuk :: Search_name (String str)

{

if (Name == str)

{

K1++;

Form1->Vkladnuk->Cells[0][k1] = Name_bank;

Form1->Vkladnuk->Cells[1][k1] = Id_bank;

Form1->Vkladnuk->Cells[2][k1] = Id_kod;

Form1->Vkladnuk->Cells[3][k1] = Pasport;

Form1->Vkladnuk->Cells[4][k1] = Name;

Form1->Vkladnuk->Cells[5][k1] = Vklad;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

for(int i = 0; i<Form1->Vkladnuk->RowCount-1;i++)

for(int j = 0; j<Form1->Vkladnuk->ColCount;j++)

Vk[i]->Input(i,j);

for(int i = 1; i<Form1->Vkladnuk->RowCount;i++)

{

Vk[i] = new TVkladnuk(Form1->Vkladnuk->Cells[0][i],

StrToFloat(Form1->Vkladnuk->Cells[1][i]),

StrToFloat(Form1->Vkladnuk->Cells[2][i]), Form1->Vkladnuk->Cells[3][i],

Form1->Vkladnuk->Cells[4][i],StrToFloat(Form1->Vkladnuk->Cells[5][i]));

}

}

//---------------------------------------------------------------------------

void TVkladnuk :: Input(int St, int Cl)

{

Spisok->LoadFromFile("izhodn.txt");

String Stroka = Spisok->Strings[St];

Cl=0;

char *S = Stroka.c_str();

char *S1 = strtok(S," ");

if (S1) {

Form1->Vkladnuk->Cells[Cl][St+1] = S1;

}

while (S1)

{

S1 = strtok(NULL," ");

if (S1)

{

++Cl;

Form1->Vkladnuk->Cells[Cl][St+1] = S1;

}

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::VkladnukExit(TObject *Sender)

{

TGridRect myRect;

myRect.Left = myRect.Right = myRect.Top = myRect.Bottom = -1;

Vkladnuk->Selection = myRect;

}

Рис.1 Вікно виконання програми