You are on page 1of 13

11/1/2017

Objektno-orijentisano
programiranje

1. Konstruktori
2. Destruktori
3. Poziv konstruktora i destruktora
4. Prijateljske funkcije i klase

Konstruktori
 Specijalne funkcije članice klase
 Inicijalizuju atribute klase
 Isto ime kao i ime klase
 Nemaju povratni tip

 Pozivaju se kada se kreira objekat klase

 Klasa može da sadrži više konstruktora koji se razlikuju


po broju ili po tipovima argumenata
 Overloading funkcija

1
11/1/2017

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;

};

2
11/1/2017

Konstruktori klase Time


//Time.cpp
//default constructor //constructor with arguments
Time::Time() Time::Time(int h, int m, int s)
: hour(0), minute(0), second(0) : hour(h), minute(m), second(s)
{ {
} }

ili: ili:

Time::Time() Time:: Time(int h, int m, int s)


{ {
hour = minute = second = 0; hour = h;
} minute = m;
second = s;
}

Poziv konstruktora

 Kada se objekti kreiraju u  Kada se objekti kreiraju u


statičkoj zoni memorije: dinamičkoj zoni
memorije:
Time t1; //default const.
Time* pt1;
Time t2(10,50,30); pt1 = new Time;
Time* pt2;
pt2 = new Time(10,50,30);
...
delte pt1;
delete pt2;

3
11/1/2017

Konstruktori klase Vector


//Vector.h //Vector.cpp
class Vector Vector::Vector()
{ {
public: n = 0;
Vector(); a = 0;
Vector( int k ); }

private: Vector::Vector(int k)
int n; {
int* a; n = k;
}; a = new int[k];
}

Šta se obavezno navodi u delu za


inicijalizaciju?
 Inicijalizacija konstanti,
 Poziv konstuktora atributa (ukoliko se oni ne
kreiraju korišćenjem podrazumevanog
konstruktora),
 U izvedenim klasama – poziv konstruktora
roditeljskih klasa.

4
11/1/2017

Inicijalizacija konstanti
//Krug.h //Krug.cpp
class Krug Krug::Krug()
{ : pi(3.14f)
public: {
Krug(); r = 0;
Krug( float r ); }

private: Krug::Krug(float r)
float r; : pi(3.14f)
const float pi; {
}; this->r = r;
}

Kreiranje atrubuta u inicijalizaciji


//Interval.h //Interval.cpp
class Interval Interval::Interval()
{ {
public: }
Interval();
Interval(int h1, int m1, Interval::Interval( int h1, int m1,
int s1, int h2, int s1, int h2,
int m2, int s2 ); int m2, int s2)
… : start(h1,m1,s1), end(h2,m2,s2)
private: {
Time start; }
Time end;
};

5
11/1/2017

Destruktori

 Specijalne funkcije koje


 Imaju isto ime kao i klasa
 Imenu prethodi simbol tilda (~)

 Nemaju argumente
 Ne mogu biti overloadovani (preklopljeni)
 Automatski se pozivaju pri uklanjanju objekta iz memorije

 Zadatak destruktora
 Da izbrišu sve atribute kreirane u dinamičkoj zoni memorije.

Primer destruktora
//Vector.h //Vector.cpp
class Vector Vector::~Vector()
{ {
public: delete [] a;
Vector(); }
Vector( int k );
~Vector();

private:
int n;
int* a;
};

6
11/1/2017

Konstruktori za kopiranje

 Specijalna vrsta konstruktora koji prave kopiju


postojećeg objekta.
 Objekat čija se kopija pravi se obavezno prenosi
po referenci.

Primer konstrukora za kopiranje


//Vector.h //Vector.cpp
class Vector Vector::Vector(Vector& v)
{ {
public: n=v.n;
Vector(); a=new int[n];
Vector( int k ); for (int i=0; i<n; i++)
Vector(Vector& v); a[i]=v.a[i];
~Vector(); }

private:
int n;
int* a;
};

7
11/1/2017

Poziv konstruktora za kopiranje

 Eksplicitno:
Vector v1(20);

Vector v2(v1);
Vector v3=v1;
 Implicitno:
 Pri prenosu parametara po vrednosti,
 Pri vraćanju rezultata funkcije po vrednosti.
 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.
 Problem nastaje ako objekat sadrži podatke u dinamičkoj zoni memorije.

Pitanja

 Koji problemi nastaju kada se po vrednosti


prenose objekti koji u sebi imaju dinamičke
atribute, a u klasi ne postoji konstruktor za
kopiranje?
 Zašto se konstruktru za kopiranje argument
obavezno prenosi po referenci ?

8
11/1/2017

Zadatak:
 Na programskom jeziku C++ kreirati klasu Krug koja ima privatni
atribut poluprečnik i statičku konstantu Pi. Javne metode klase krug
su:
 konstruktor koji inicijalizuje dužinu poluprečnika,
 funkcija za izračunavanje obima,
 funkcija za izračunavanje površine.
 Kreirati i klasu Valjak čiji su privatni atributi:
 osnova valjka – objekat klase krug,
 visina valjka.
 U javnom delu klase Valjak definisati:
 konsturktor koji inicijalizuje poluprečnik osnove i visinu valjka,
 metoda za izračunavanje površine valjka,
 metoda za izračunavanje zapremine.
 U funkciji main kreirati 2 objekta klase Valjak (jedan u statičkoj, a
drugi u dinamičkoj zoni memorije). Poluprečnike osnova i visine
učitati sa standardnog ulaza. Na standardni izlaz prikazati površine i
zapremine oba tela.

Konstantni objekti i konstantne metode

 Definicija konstantnog objekta:


const Time podne(12,0,0);
const Time ponoc(0,0,0);

 Nad konstantnim objektom se mogu pozvati


samo konstantne funkcije.

9
11/1/2017

Definicija konstantne funkcije

 Svaku funkciju koja ne menja ni jedan atribut klase (tj. ne


menja objekat treba definisati kao konstantnu).

 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;
};

10
11/1/2017

Prijatelji klasa

 Ponekad je potrebno da klasa ima i "povlašćene"


korisnike koji mogu da pristupaju njenim privatnim
članovima.
 Povlašćeni korisnici mogu biti funkcije ili cele klase.
 Takve funkcije i klase nazivaju se prijateljima (engl. friends).

Prijateljske funkcije
 Prijateljske funkcije su funkcije koje nisu članice klase koje mogu da
pristupju privatnim članova klase.
 Prijateljske funkcije mogu da budu:
 globalne funkcije ili
 članice drugih klasa.
 Funkcija je prijateljska ako se u definiciji klase navede deklaracija
funkcije sa ključnom reči friend ispred.
 Nevažno je da li se deklaracija prijateljske funkcije navodi u
privatnom ili javnom delu klase.
 Prijateljska funkcija nema pokazivač this na objekat klase kojoj je
prijatelj.
 Funkcija može da bude prijatelj većem broju klasa istovremeno.

11
11/1/2017

Primer prijateljskih funkcija


class X
{
friend void g (int,X&); // prijateljska globalna funkcija
friend void Y::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
 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.
...
};
 Sve metode klase Y mogu da pristupaju privatnim
članovima klase X.
 Prijateljske klase se koriste kada neke dve klase imaju
tešnje međusobne veze .

12
11/1/2017

Zadatak 2.
 Na programskom jeziku C++ napraviti aplikaciju koja vrši
obradu podataka sa prijemnog ispita na na jednom
fakultetu. U tu svrhu kreirati klasu Student koja kao
privatne atribute ima:
 ime – maksimalne dužine 10 karaktera,
 prezime – maksimalne dužine 10 karaktera i
 broj bodova.

 U javnom delu klase definisati:


 funkciju koja ucitava podatke o studentu sa standardnog ulaza,
 funkciju koja prikazuje podatke o studentu na standardni izlaz,
 inline funkciju koja vraca broj bodova.

Zadatak 2.
 Kreirati i klasu PrijemniIspit čiji su privatni atributi:
 broj prijavljenih kandidata,
 niz podataka o prijavljenim kandidatima zapamćen u dinamičkoj zoni
memorije,
 maksimalni broj kandidata koje fakultet moze da upise,
 prag prolaznosti - minimalni broj bodova koje student treba da ima da bi bio
upisan,
 U javnom delu klase definisati:
 konstruktor koji postavlja broj prijavljenih kandidata, broj kandidata koje
fakultet prima i prag prolaznosti,
 destruktor,
 funkciju koja sa standardnog ulaza ucitava podatke o prijavljenim
kandidatima,
 funkciju koja na standardni izlaz prikazuje listu primljenih kandidata uredjenu
u nerastućem redosledu prema broju bodova (u ovoj funkciji koristiti
privatnu funkciju za uredjivanje liste kandidata po navedenom kriterijumu).
 U funkciji main učitati sve podatke o prijemnom ispitu sa standardnog
ulaza i na standardni izlaz prikazati rang listu primljenih kandidata.

13

You might also like