Laboratorijas darbs 13. Objektorientētā programmēšanas konstrukciju izpēte
Laboratorijas darbs 13.1. Destruktora darbības izpēte
Valodā C++ objekti ir izmantojami 2 veidos (lab13.1.cpp):
· tiešā veidā (mainīgais ir ar tipu klase; laukiem un metodēm pieeja notiek ar punkta (.) notāciju);
· dinamiskā veidā (mainīgais ir ar tipu klase*, t.i., norāde uz klase; laukiem un metodēm pieeja notiek ar bultiņas (->) notāciju)
#include <iostream>
using namespace std;
class person
{
private:
char *name;
int age;
public:
person (const char *n, int a) { init (n,a); };
person () {};
~person ();
void init (const char*, int);
void print () { cout << name << " " << age << endl; }
};
int main ()
{
person p;
p.init ("Liz", 19);
p.print ();
person *pp = new person ("Peter", 20);
pp->print ();
delete pp;
return 0;
};
person::~person ()
{
cout << "Deleting: " << name << endl;
delete[] name;
};
void person::init (const char *n, int a)
{
name = new char[strlen(n)+1];
strcpy (name, n);
age = a;
}
Destruktors ir tāda metode, kas tiek automātiski izsaukta tieši pirms objekta likvidēšanas.
Pievērst uzmanību dotajā programmā destruktora izsaukšanai vispirms tiek izsaukts Peter destruktors, pēc tam Liz destruktors.
Tas tāpēc, ka dinamiskiem objektiem destruktors tiek izsaukts tad, kad tiek izsaukts delete, bet tiešā veidā izmantotam objektam tas tiek izsaukts tā figūriekavu bloka beigās, kur tas deklarēts.
Laboratorijas darbs 13.2. Konstruktora darbības izpēte
(lab13.2.cpp)
#include <iostream>
using namespace std;
class timesimple
{
int hours, minutes;
public:
timesimple (int h, int m)
{
hours = h;
minutes = m;
cout << "C1 " << hours << ":" << minutes << endl;
};
timesimple (const timesimple &t)
{
hours = t.hours + 1;
minutes = t.minutes + 1;
cout << "C2 " << hours << ":" << minutes << endl;
};
timesimple (int h): hours(h), minutes(0)
{
cout << "C3 " << hours << ":" << minutes << endl;
};
timesimple ()
{
cout << "C4" << endl;
};
void print () const;
};
int main ()
{
timesimple t (8, 20);
t.print ();
timesimple u = t;
u.print ();
timesimple v;
v = t;
v.print ();
timesimple w = 23;
w.print ();
return 0;
};
void timesimple::print () const
{
cout << hours << ":" << minutes << endl;
}
Konstruktors ir tāda metode, kas tiek automātiski izsaukta tieši pēc objekta izveidošanas. Klase var saturēt vairākus konstruktorus. Īpaši konstruktori ir tie, kam ir viens parametrs, jo tie tiek netieši izsaukti, veicot objekta inicializāciju pie deklarēšanas ar piešķiršanas operatoru = (veicot parastu piešķiršanu pēc deklarēšanas tas nestrādā!).
Pievērst uzmanību konstruktoru izsaukšanai dotajā programmā īpaši konstruktoriem ar vienu parametru (C2, C3).
Laboratorijas darbs 13.3. Dinamiska masīva realizācijas izpēte
(lab13.3.cpp)
#include <iostream>
using namespace std;
class dynamicarray
{
int Size;
int *Array;
public:
dynamicarray (int s=0)
{
Size = s;
if (Size > 0) Array = new int[Size];
};
~dynamicarray ()
{
if (Size > 0)
{
cout << Size << " elements deleted." << endl;
delete[] Array;
}
};
void append (int value)
{
int *tmparray = new int[Size+1];
for (int i=0; i<Size; i++) tmparray[i] = Array[i];
tmparray[Size] = value;
Size++;
delete[] Array;
Array = tmparray;
};
void print ()
{
for (int i=0; i<Size; i++) cout << Array[i] << endl;
};
int& operator[] (int i) { return Array[i]; };
};
int main ()
{
dynamicarray arri(2);
arri[0] = 11;
arri[1] = 22;
arri.append (33);
arri.print ();
return 0;
}
Destruktora jēga pēc būtības parādās tikai tad, ja objekts satur dinamiskas datu struktūras, jo, izmantojot destruktoru var noteikt, ka pie objekta likvidēšanas likvidēt arī dinamisko struktūru vai struktūras.
Dotais piemērs ietver vienkāršotu dinamiska int masīva realizāciju ar klasi, kas demonstrē destruktora izmantošanu pēc būtības. Bez tam piemērā parādīta operatora [] pārslogošana, lai būtu iespēja to izmantot pa taisno klases dynamicarray objektiem.