пример 3: конструктори и деструктори (constructor, destructor)

Конструктори и деструктори су специјалне методе (функције чланице) класе који се имплицитно позивају на почетку (конструктор) и на крају (деструктор) животног века објекта неке класе. Имају потпуно исто име као и класа (деструктор има знак ~ испред имена) и не смеју да враћају никакав тип, чак ни void. Декларисање конструктора или деструктора може да се изостави, али у том случају сам преводилац ће генерисати тзв. default constructor и/или default destructor.

Намена конструктора је да "конструише" објекат, тј. да изврши све што је неопходно да би се објекат неке класе, на почетку његовог "живота", довео у "радно" стање. То може бити, на пример, иницијализација неких унутрашњих чланова података, заузимање меморије за неке потребе објекта и слично. Конструктор се може и преклопити (overload), што практично значи да класа може да има више конструктора, о чему ћемо у неком од следећих примера.

Намена деструктора је управо супротна намени конструктора. Он мора да "почисти" за објектом, односно да изврши све што је потребно урадити када објекат престаје да "живи". На пример, да ослободи меморију коју је конструктор заузео на почетку и слично.

У следећем, релативно једноставном али ипак нешто сложенијем примеру од претходних, ћемо показати како функционишу конструктори и деструктори, а биће показан и један нови однос између објеката две класе, у коме објекат једне класе уме да "користи" објекат друге класе.

Питање за наставника ...

Погледајте и анализирајте пажљиво овај пример.

модул особа

osoba.h

#ifndef _osoba.h
#define _osoba.h

//////////////////////
// deklaracija klase
//////////////////////
class TOsoba
{
// sve sto nije deklarisano pod public:
// smatra se po "default"-u private: 
char* Ime;
char* Prezime;
public:  // javne metode
TOsoba(const char* const, const char* const); // konstruktor
~TOsoba(); // destruktor
void PredstaviSe();
};

#endif

osoba.cpp

#include <iostream>
#include <string>


#include "osoba.h"

///////////////////////////
// implementacija metoda klase
////////////////////////

// konstruktor
TOsoba::TOsoba(const char* const theIme, const char* const thePrezime)
{
Ime = new char[100];
Prezime = new char[100];
strcpy(Ime, theIme);
strcpy(Prezime, thePrezime);
}

// destruktor
TOsoba::~TOsoba()
{
cout<<"Ubila se osoba "<<Ime<<" "<<Prezime<<endl;
delete[] Ime;
delete[] Prezime;
}

void TOsoba::PredstaviSe()
{
cout << "Ja sam osoba " << Ime << " " << Prezime << endl;
}
///////////////////////////////////////
// kraj implementacije klase
//////////////////////////////////////

модул полицајац

policajac.h

#ifndef _policajac.h
#define _policajac.h

#include "osoba.h"

class TPolicajac
{
char* Ime;
char* Znacka;
public:
TPolicajac(const char* const, const char* const);
~TPolicajac();
void Legitimisi(TOsoba*);
};

#endif

policajac.cpp

#include "policajac.h"

TPolicajac::TPolicajac(const char* const theIme, const char* const theZnacka)
{
Ime = new char[100];
Znacka = new char[100];
strcpy(Ime, theIme);
strcpy(Znacka, theZnacka);
}

TPolicajac::~TPolicajac()
{
cout<<"Ubio se policajac "<<Ime<<" "<<Znacka<<endl;
delete[] Ime;
delete[] Znacka;
}

void TPolicajac::Legitimisi(TOsoba* o)
{
cout << "Ja sam policajac " << Ime <<" (" << Znacka << "). ";
cout << "Predstavi se!" << endl;
o->PredstaviSe();
cout << endl;
}

main функција

#include <conio>
#include <iostream>

// moji headeri uvek treba da idu posle standardnih
#include "osoba.h"
#include "policajac.h"

main()
{
// staticko koriscenje klase
TOsoba p("Pera", "Peric"),
m("Mile", "Miletic");  // deklaracija i poziv konstruktora

TPolicajac r("Bambusic", "332344");

cout<<"STATICKI OBJEKTI:"<<endl;
r.Legitimisi(&p);
r.Legitimisi(&m);


// dinamicko koriscenje klase
// deklaracija objekta, zauzimanje memorije za objekat (new) i poziv konstruktora
TOsoba *pp = new TOsoba("Marko", "Markovic"),
*pm = new TOsoba("Kosta", "Kostic");

TPolicajac *pr = new TPolicajac("Bambalic", "534583");

cout<<"DINAMICKI OBJEKTI"<<endl;
pr->Legitimisi(pp);
pr->Legitimisi(pm);

cout<<"brisanje dinamickih objekata, implicitni poziv destruktora"<<endl;
delete pp;
delete pm;
delete pr;

getch();
}