You are on page 1of 27

Objektno-orijentisano

programiranje
1. Konstruktori
2. Destruktori
3. Pozivkonstruktorai destruktora
4. Prijateljskefunkcijei klase
Konstruktori
n Specijalne funkcije lanice klase
n Inicijalizuju atribute klase
n Isto ime kao i ime klase
n Nemaju povratni tip
n Pozivaju se kada se kreiraobjekat klase
n Klasa mo#e da sadr#i vi%e konstruktora koji se razlikuju
po broju ili po tipovima argumenata
n Overloading funkcija
Implementacija konstruktora
//A.h
class A
{
public:
A();
A(int,float);

};
//A.cpp
A::A()
: <inicijalizacija>
{
<telo>
}
Konstruktori klase Time
//Time.h
class Time
{
public:
Time(); //default constructor
Time( int, int, int ); // set hour, minute, second
...
private:
int hour;
int minute;
int second;
};
Konstruktori klase Time
//Time.cpp
//default constructor
Time::Time()
: hour(0), minute(0), second(0)
{
}
ili:
Time::Time()
{
hour = minute = second = 0;
}
//constructor with arguments
Time::Time(int h, int m, int s)
: hour(h), minute(m), second(s)
{
}
ili:
Time:: Time(int h, int m, int s)
{
hour = h;
minute = m;
second = s;
}
Poziv konstruktora
n Kadase objekti kreirajuu
statikoj zoni memorije:
Time t1; //default const.
Time t2(10,50,30);
n Kada se objekti kreiraju u
dinamikoj zoni
memorije:
Time* pt1;
pt1 = new Time;
Time* pt2;
pt2 = new Time(10,50,30);
...
delte pt1;
delete pt2;
Konstruktori klase Vector
//Vector.h
class Vector
{
public:
Vector();
Vector( int k );

private:
int n;
int* a;
};
//Vector.cpp
Vector::Vector()
{
n = 0;
a = 0;
}
Vector::Vector(int k)
{
n = k;
a = new int[k];
}
ta se obavezno navodi u delu za
inicijalizaciju?
n Inicijalizacijakonstanti,
n Pozivkonstuktoraatributa(ukolikose oni ne
kreirajukori%'enjem podrazumevanog
konstruktora),
n U izvedenim klasama poziv konstruktora
roditeljskih klasa.
Inicijalizacija konstanti
//Krug.h
class Krug
{
public:
Krug();
Krug( float r );

private:
float r;
const float pi;
};
//Krug.cpp
Krug::Krug()
: pi(3.14f)
{
r = 0;
}
Krug::Krug(float r)
: pi(3.14f)
{
this->r = r;
}
Kreiranje atrubuta u inicijalizaciji
//Interval.h
class Interval
{
public:
Interval();
Interval(int h1, int m1,
int s1, int h2,
int m2, int s2 );

private:
Time start;
Time end;
};
//Interval.cpp
Interval::Interval()
{
}
Interval::Interval( int h1, int m1,
int s1, int h2,
int m2, int s2)
: start(h1,m1,s1), end(h2,m2,s2)
{
}
Destruktori
n Specijalne funkcije koje
q Imaju isto ime kao i klasa
n Imenu prethodi simbol tilda(~)
q Nemaju argumente
q Ne mogu biti overloadovani (preklopljeni)
q Automatski se pozivaju pri uklanjanju objekta iz memorije
n Zadatak destruktora
q Da izbri%u sve atribute kreirane u dinamikoj zoni memorije.
Primer destruktora
//Vector.h
class Vector
{
public:
Vector();
Vector( int k );
~Vector();

private:
int n;
int* a;
};
//Vector.cpp
Vector::~Vector()
{
delete [] a;
}
Konstruktori za kopiranje
n Specijalnavrstakonstruktorakoji pravekopiju
postoje'eg objekta.
n Objekat ija se kopija pravi se obavezno prenosi
po referenci.
Primer konstrukora za kopiranje
//Vector.h
class Vector
{
public:
Vector();
Vector( int k );
Vector(Vector& v);
~Vector();

private:
int n;
int* a;
};
//Vector.cpp
Vector::Vector(Vector& v)
{
n=v.n;
a=new int[n];
for (int i=0; i<n; i++)
a[i]=v.a[i];
}
Poziv konstruktora za kopiranje
n Eksplicitno:
Vector v1(20);

Vector v2(v1);
Vector v3=v1;
n Implicitno:
q Pri prenosuparametarapovrednosti,
q Pri vra'anju rezultata funkcije po vrednosti.
q Ukoliko konstruktor za kopiranje ne postoji, kopija se pravi tako %to se
svi atributi objekta koji se kopira jednostavno prepi%u u objekat u koji
se kopira.
n Problem nastaje ako objekat sadr#i podatke u dinamikoj zoni memorije.
Pitanja
n Koji problemi nastaju kada se po vrednosti
prenose objekti koji u sebi imaju dinamike
atribute, a u klasi ne postoji konstruktor za
kopiranje?
n Za%to se konstruktru za kopiranje argument
obavezno prenosi po referenci ?
Redosled poziva konstruktora i destruktora
n Globalni objekti
q Konstruktori
n Pre bilo koje druge funkcije (uklju#uju%i i main)
q Destruktrori
n Kada se main zavr'ava (ili je pozvana exit funkcija)
n Ne poziva se ako se program zavr'i sa abort
Redosled poziva konstruktora i destruktora
n Lokalni objekti
q Konstruktori
n Kada se objekti defini'u
q Svaki put kada u toku izvr'enja dobiju scope
q Destruktrori
n Kada objekti prestanu da va)e tj gube scope
q Kada se zavr'ava blok u kome je objekat definisan
Redosled poziva konstruktora i destruktora
n Statiki lokalni objekti
q Konstruktori
n Ta#no jednom kada izvr'enje dodje do mesta gde je objekat
definisan.
q Destruktrori
n Kada se main zavr'ava (ili je pozvana exit funkcija)
n Ne poziva se ako se program zavr'i sa abort
Zadatak:
n Na programskomjezikuC++kreirati klasuKrug kojaimaprivatni
atribut polupreniki statikukonstantuPi. Javnemetodeklasekrug
su:
q konstruktor koji inicijalizuje du#inu polu%renika,
q funkcija za izraunavanje obima,
q funkcija za izraunavanje povr%ine.
n Kreirati i klasu Valjakiji su privatni atributi:
q osnova valjka objekat klase krug,
q visina valjka.
n U javnom delu klase Valjak definisati:
q konsturktor koji inicijalizuje poluprenik osnove i visinu valjka,
q metoda za izraunavanje povr%ine valjka,
q metoda za izraznavanje zapremine.
n U funkciji main kreirati 2 objekta klase Valjak (jedan u statikoj, a
drugi u dinamikoj zoni memorije). Poluprenike osnova i visine
uitati sa standardnog ulaza. Na standardni izlaz prikazati povr%ine i
zapremine oba tela.
Konstantni objekti i konstantne metode
n Definicija konstantnog objekta:
const Time podne(12,0,0);
const Time ponoc(0,0,0);
n Nad konstantnim objektom se mogu pozvati
samo konstantne funkcije.
Definicija konstantne funkcije
n Svaku funkciju koja ne menja ni jedan atribut klase (tj. ne
menja objekat treba definisati kao konstantnu).
n Funkcija je konstatntna ako se u njenoj deklaraciji ili
definiciji iza zaglavlja funkcije navede klju#na re# const.
Definisanje konstantnih funkcija - primer
class Time
{
public:
Time();
Time( int, int, int );
void setTime( int, int, int );
void printUniversal() const;
void printStandard()const;
inline setHour( int );
inline getHour( ) const;
private:
int hour;
int minute;
int second;
};
Prijatelji klasa
n Ponekad je potrebno da klasa ima i "povla'%ene"
korisnike koji mogu da pristupaju njenim privatnim
#lanovima.
n Povla%'eni korisnici mogu biti funkcijeili celeklase.
n Takvefunkcijei klasenazivajuse prijateljima(engl. friends).
Prijateljske funkcije
n Prijateljskefunkcijesufunkcijekojenisulaniceklasekoje mogu da
pristupju privatnimlanovaklase.
n Prijateljskefunkcijemogudabudu:
q globalne funkcije ili
q #lanice drugih klasa.
n Funkcijajeprijateljskaakose u definiciji klasenavededeklaracija
funkcijesakljunomrei friendispred.
n Neva#nojedali se deklaracijaprijateljskefunkcijenavodi u
privatnomili javnomdeluklase.
n Prijateljskafunkcijanemapokaziva this naobjekat klasekojoj je
prijatelj.
n Funkcijamo#edabudeprijatelj ve'embrojuklasaistovremeno.
Primer prijateljskih funkcija
class X
{
friend voidg (int,X&); // prijateljska globalna funkcija
friend voidY::h (); // prijateljska f-ja clanica druge klase
int i;
public:
void f(int ip) {i=ip;}
};
void g (int k, X &x) {
x.i=k; // prijateljska funkcija pristupa privatnim clanovima
}
void main () {
X x;
x.f(5); // postavljanje preko funckije clanice klase
g(6,x); // postavljanje preko prijateljske funkcije
}
Prijateljske klase
n Ako su sve metode klase Y prijateljske funkcije klasi X, onda je
Y prijateljska klasa (friend class) klasi X
class X
{
friend Y; //ako je klasa Y definisana ili deklarisana
friend class Z; //ako Z jos nije ni def.ni dek.
...
};
n Sve metode klase Y mogu da pristupaju privatnim #lanovima
klase X.
n Prijateljske klase se koriste kada neke dve klase imaju te'nje
me+usobne veze .

You might also like