You are on page 1of 14

VISOKA TEHNIKA KOLA STRUKOVNIH STUDIJA Novi Beograd

SEMINARSKI RAD
POJAM I DEKLARACIJA KLASE

PREDMET: PROGRAMIRANJE

PROFESOR Dr. ore Dihovini

STUDENT Babi Goran 137/09

Beograd jun 2012 godine

Sadraj

1. 2. 3. 4. 5. 6. 7.

Uvod...................................................................................................... Klase..................................................................................................... Pokaziva this....................................................................................... Konstantne funkcije lanice.................................................................. Ugnjeivanje klasa.............................................................................. Strukture............................................................................................... Zajedniki lanovi klasa.......................................................................

3 3 6 7 8 9 1 0 1 1 1 2 1 4 1 5

8. Zajednike funkcije lanice................................................................... 9. Prijatelji klasa....................................................................................... 10. Zakljuak............................................................................................


11.

Literatura............................................................................................

1. Uvod
Da bi se prevazile tekoe nastale uslonjavanjem programa, smiljen je novi pristup objektno orijentisano programiranje (engl. object-oriented programming). Ovim pristupom program se organizuje oko podataka (tj. objekata) i oko skupa dobro definisanih naina pristupa ka tim podacima. Objektno orijentisan program karakteriu podaci koji upravljaju pristupanjem skupu naredaba. Uveriete se i sami da preputanje kontrole podacima donosi vie organizacionih prednosti. Koncept orijentacije na objekte predstavlja sr Jave, ba kao to predstavlja osnovu ljudskog poimanja. Vano je da razumete kako se ove koncepcije ugradjuju u programe. Videete da je objektno orijentisano programiranje moan i prirodan uzor za pravljenje programa koji preivljavaju neizbene promene u ivotu svakog vanijeg softverskog projekta, ukljuujui zaetak, rast i starenje. Na primer, kad postignete da objekti budu dobro definisani, a pristup njima ist i pouzdan, glatko moete da odbacite ili zamenite delove nekog starijeg sistema.

2. Klasa
Klasa (engl. class) definie strukturu i ponaanje (podatke i naredbe) zajednike za skup objekata. Svaki objekat odredjene klase ima strukturu i ponaanje definisane klasom, ba kao da predstavlja repliku klase. Zbog ovoga se objekti ponekad nazivaju primercima ili instancama klase. Na taj nain klasa predstavlja logiku konstrukciju; objekat predstavlja fiziku realnost. Kada pravite klasu, definiete kd i podatke koji je ine. Ovi elementi se jednim imenom nazivaju lanovima klase (engl. class members). Podaci definisani klasom posebno se nazivaju lanovi promenljive (engl. member variables) ili promenljive instanci (engl. instance variables). Procedure koje rade sa tim podacima nazivaju se lanovi metode (engl. member methods) ili, jednostavno, metode (engl. methods). (Ako poznajete C ili C++, dobro je da znate da ono to Java programer naziva metodom, C/C++ programer naziva funkcijom.) U ispravno napisanom Java programu metode definiu nain korienja promenljivih. To znai da su ponaanje i nain pristupa klasi definisani metodama koje rade sa podacima instance. Klasa je realizacija apstrakcije koja ima:

svoju internu predstavu (svoje atribute) i operacije koje se mogu vriti nad njom (javne funkcije lanice). Klasa definie novi tip. Jedan primerak takvog tipa (instanca klase) naziva se objektom te klase (engl. class

object). Podaci koji su deo klase nazivaju se podaci lanovi klase (engl. data members). Funkcije koje su deo klase nazivaju se funkcije lanice klase (engl. member functions). lanovi (podaci ili funkcije) :

klase iza kljune rei private: zatieni su od pristupa spolja (enkapsulirani su). Ovim lanovima mogu pristupati samo funkcije lanice klase. Ovi lanovi nazivaju se PRIVATNIM lanovima klase(engl. private class members). lanovi iza kljune rei public: dostupni su spolja i nazivaju se javnim lanovima klase (engl. public class members). lanovi iza kljune rei protected: dostupni su funkcijama lanicama date klase, kao i klasa izvedenih iz te klase, ali ne i korisnicima spolja, i nazivaju se zatienim lanovima klase (engl. protected class members).

Redosled sekcija public, protected i private je proizvoljan, ali se preporuuje ba navedeni redosled. Podrazumevano (ako se ne navede specifikator ispred) su lanovi privatni. Kae se jo da klasa ima svoje unutranje stanje, predstavljeno atributima, koje menja pomou operacija. Javne funkcije lanice nazivaju se jo i metodima klase, a poziv ovih funkcija upuivanje poruke objektu klase. Objekat klase menja svoje stanje kada se pozove njegov metod, odnosno kada mu se uputi poruka. Objekat unutar svoje funkcije lanice moe pozivati funkciju lanicu neke druge ili iste klase, odnosno uputiti poruku drugom objektu. Objekat koji alje poruku (poziva funkciju) naziva se objekat-klijent, a onaj koji je prima (ija je funkcija lanica pozvana) je objekatserver.

Preporuka je da se klase projektuju tako da nemaju javne podatke lanove. Unutar funkcije lanice klase, lanovima objekta ija je funkcija pozvana pristupa se direktno, samo navoenjem njihovog imena.

Kontrola pristupa lanovima nije stvar objekta, nego klase: jedan objekat neke klase iz svoje funkcije lanice moe da pristupi privatnim lanovima drugog objekta iste klase. Takoe, kontrola pristupa lanovima je potpuno odvojena od koncepta oblasti vaenja: najpre se, na osnovu oblasti vaenja, odreuje entitet na koga se odnosi dato ime na mestu obraanja u programu, a zatim se odreuje da li se tom entitetu moe pristupiti. Mogue je preklopiti (engl. overload) funkcije lanice, ukljuujui i konstruktore. Deklaracijom klase smatra se deo kojim se specifikuje ono to korisnici klase treba da vide. To su uvek javni lanovi. Meutim, da bi prevodilac korektno zauzimao prostor za objekte klase, mora da zna njegovu veliinu, pa u deklaraciju klase ulaze i deklaracije privatnih podataka lanova:

class Point{ private: double x,y; public: void SetPoint(double xx, double yy) {x=xx; y=yy;} double GetX() {return x;} double GetY() {return y;} double Distance(); }; class Ime_Klase{ podaci_clanovi objekti_clanovi funkcije_clanice }; Navedena deklaracija je zapravo definicija klase, ali se iz istorijskih razloga naziva deklaracijom. Pravu deklaraciju klase predstavlja samo deklaracija class Ime_Klase;. Pre potpune deklaracije (zapravo definicije) mogu samo da se definiu pokazivai i reference na tu klasu, ali ne i objekti te klase, jer se njihova veliina ne zna.

3. Pokaziva this

Unutar svake funkcije lanice postoji objekat this.

implicitni (podrazumevani, ugraeni) lokalni

Tip ovog objekta je "konstantni pokaziva na klasu ija je funkcija lanica" (ako je klasa X, this je tipa X*const). Ovaj pokaziva ukazuje na objekat ija je funkcija lanica pozvana: // definicija funkcije Add lanice klase complex complex complex::Add (complex c) { complex temp=*this; // u temp se prepisuje objekat koji je prozvan temp.real+=c.real; temp.imag+=c.imag; return temp; } //deklaracija klase complex: class complex { public: void Add(complex); void Sub(complex); float Re(); float Im(); //... private: float real,imag; };

Pristup lanovima objekta ija je funkcija lanica pozvana obavlja se neposredno; implicitno je to pristup preko pokazivaa this i operatora - >. Moe se i eksplicitno pristupati lanovima preko ovog pokazivaa unutar funkcije lanice: // nova definicija funkcije Add lanice klase complex complex complex::Add (complex c) { complex temp; temp.real=this->real+c.real; temp.imag=this->imag+c.imag; return temp; } Pokaziva this je, u stvari, jedan skriveni argument funkcije lanice. Poziv objekat.f() prevodilac prevodi u kod koji ima semantiku kao f(&objekat). Sa objektima klase moe se raditi sledee:

definisati primerci (objekti) te klase i nizovi objekata klase; definisati pokazivai na objekte i reference na objekte;

dodeljivati vrednosti (operator =) jednog objekta drugom; uzimati adrese objekata (OPERATOR&) i posredno pristupati objektima preko pokazivaa (operator *); pristupati lanovima i pozivati funkcije lanice neposredno (operator .) ili posredno (operator ->); prenositi objekti kao argumenti funkcija i to po vrednosti ili referenci, ili prenositi pokazivai na objekte; vraati objekte iz funkcija po vrednosti ili referenci, ili vraati pokazivae na objekte. Neke od ovih operacija korisnik moe redefinisati preklapanjem operatora.

Ostale, ovde nenavedene operacije korisnik mora definisati posebno ako su potrebne (ne podrazumevaju se).

4. Konstantne funkcije lanice


Dobra programerska praksa je da se korisnicima klase specifikuje da li neka funkcija lanica menja unutranje stanje objekta ili ga samo "ita" i vraa informaciju korisniku klase. Funkcije lanice koje ne menjaju unutranje stanje objekta nazivaju se inspektori ili selektori (engl. inspector, selector). Da je funkcija lanica inspektor, korisniku klase govori re const iza zaglavlja funkcije. Ovakve funkcije lanice nazivaju se u jeziku C++ konstantnim funkcijama lanicama (engl. constant member functions). Funkcija lanica koja menja stanje objekta naziva se mutator ili modifikator (engl. mutator, modifier) i posebno se ne oznaava:

class X { public: int read () const { return i; } int write (int j=0) { int temp=i; i=j; return temp; } private: int i; };

Deklarisanje funkcije lanice kao inspektora je samo notaciona pogodnost i "stvar lepog ponaanja prema korisniku". To je "obeanje" projektanta klase korisnicima da funkcija ne menja stanje objekta, onako kako je projektant klase definisao stanje objekta. Prevodilac nema

naina da u potpunosti proveri da li inspektor posrednog obraanja.

menja neke podatke lanove klase preko nekog

Inspektor moe da menja podatke lanove, uz pomo eksplicitne konverzije, koja "probija" kontrolu konstantnosti. To je ponekad sluaj kada inspektor treba da izrauna podatak koji vraa (npr. duinu liste), pa ga onda sauva u nekom lanu da bi sledei put bre vratio odgovor. U konstantnoj funkciji lanici tip pokazivaa this je const X*const, tako da pokazuje na konstantni objekat, pa nije mogue menjati objekat preko ovog pokazivaa (svaki neposredni pristup lanu je implicitni pristup preko ovog pokazivaa). Takoe, za konstantne objekte klase nije dozvoljeno pozivati nekonstantnu funkciju lanicu (korektnost konstantnosti). Za prethodni primer: X x; const X cx; x.read(); // u redu: konstantna funkcija nekonstantnog objekta; x.write(); // u redu: nekonstantna funkcija nekonstantnog objekta; cx.read(); // u redu: konstantna funkcija konstantnog objekta; cx.write(); // greka: nekonstantna funkcija konstantnog objekta;

5. Ugnjeivanje klasa

Klase mogu da se deklariu i unutar deklaracije druge klase (ugneivanje deklaracija klasa). Na ovaj nain se ugneena klasa nalazi u oblasti vaenja okruujue klase, pa se njenom imenu moe pristupiti samo preko operatora razreavanja oblasti vaenja :: . Okruujua klasa nema nikakva posebna prava pristupa lanovima ugneene klase, niti ugneena klasa ima posebna prava pristupa lanovima okruujue klase. Ugneivanje je samo stvar oblasti vaenja, a ne i kontrole pristupa lanovima.

int x,y; class Spoljna { public: int x; class Unutrasnja { void f(int i, Spoljna *ps) { x=i; // greka: pristup Spoljna::x nije korektan! ::x=i; // u redu: pristup globalnom x;

y=i; // u redu: pristup globalnom y; ps->x=i; // u redu: pristup Spoljna::x objekta *ps; } }; }; Unutrasnja u; // greka: Unutrasnja nije u oblasti vaenja! Spoljna::Unutrasnja u; // u redu; Unutar deklaracije klase se mogu navesti i deklaracije nabrajanja (enum), i typedef deklaracije. Ugneivanje se koristi kada neki tip (nabrajanje ili klasa npr.) semantiki pripada samo datoj klasi, a nije globalno vaan i za druge klase. Ovakvo korienje poveava itljivost programa i smanjuje potrebu za globalnim tipovima.

6. Strukture
Struktura je klasa kod koje su svi lanovi podrazumevano javni. Moe se to promeniti eksplicitnim umetanjem public: i private: struct A { //... private: //... }; class A { public: //... private: //... }; Struktura se tipino koristi za definisanje slogova podataka koji ne predstavljaju apstrakciju, odnosno nemaju ponaanje (nemaju znaajnije operacije). Strukture tipino poseduju samo konstruktore i eventualno destruktore kao funkcije lanice

7. Zajedniki lanovi klasa


Pri kreiranju objekata klase, za svaki objekat se kreira poseban komplet podataka lanova. Ipak, mogue je definisati podatke lanove za koje postoji samo jedan primerak za celu klasu, tj. za sve objekte klase.

10

Ovakvi lanovi nazivaju se statikim

lanovima, i deklariu se pomou rei static:

class X { public: //... private: static int i; // postoji samo jedan i za celu klasu int j; // svaki objekat ima svoj j //... }; Svaki pristup statikom lanu iz bilo kog objeka klase znai pristup istom zajednikom lanu-objektu. Statiki lan klase ima ivotni vek kao i globalni statiki objekat: nastaje na poetku programa i traje do kraja programa. Uopte, statiki lan klase ima sva svojstva globalnog statikog objekta, osim oblasti vaenja klase i kontrole pristupa. Statiki lan mora da se inicijalizuje posebnom deklaracijom van deklaracije klase. Obraanje ovakvom lanu van klase vri se preko operatora : Za prethodni primer: int X::i=5; Statikom lanu moe da se pristupi iz funkcije lanice, ali i van funkcija lanica, ak i pre formiranja ijednog objekta klase (jer statiki lan nastaje kao i globalni objekat), naravno uz potovanje prava pristupa.Tada mu se pristupa preko operatora (X::j). Zajedniki lanovi se uglavnom koriste kada svi primerci jedne klase treba da dele neku zajedniku informaciju, npr. kada predstavljaju neku kolekciju, odnosno kada je potrebno imati ih "sve na okupu i pod kontrolom". Na primer, svi objekti neke klase se uvezuju u listu, a glava liste je zajedniki lan klase. Zajedniki lanovi smanjuju potrebu za globalnim objektima i tako poveavaju itljivost programa, jer je mogue ograniiti pristup njima, za razliku od globalnih objekata. Zajedniki lanovi logiki pripadaju klasi i "upakovani" su u nju.

8. Zajednike funkcije lanice


Funkcije lanice mogu da se deklariu kao zajednike za celu klasu, dodavanjem rei ispred deklaracije funkcije lanice.

static

11

Statike funkcije lanice imaju sva svojstva globalnih funkcija, osim oblasti vaenja i kontrole pristupa. One ne poseduju pokaziva this i ne mogu neposredno (bez pominjanja konkretnog objekta klase) koristiti nestatike lanove klase. Mogu neposredno koristiti samo statike lanove te klase. Statike funkcije lanice se mogu pozivati za konkretan objekat (to nema posebno znaenje), ali i pre formiranja ijednog objekta klase, preko operatora : class X { static int x; // staticki podatak clan; int y; public: static int f(X,X&); // statika funkcija lanica; int g(); }; int X::x=5; // definicija statikog podatka lana;

int X::f(X x1, X& x2){ // definicija statike funkcije lanice; int i=x; // pristup statikom lanu X::x; int j=y; // greka: X::y nije statiki, // pa mu se ne moe pristupiti neposredno! int k=x1.y; // ovo moe; return x2.x; // i ovo moe, // ali se izraz "x2" ne izraunava; } int X::g () { int i=x; // nestatika funkcija lanica moe da int j=y; // koristi i pojedinane i zajednike return j; // lanove; y je ovde this->y; } void main () { X xx; int p=X::f(xx,xx); // X::f moe neposredno, bez objekta; int q=X::g(); // greka: za X::g mora konkretan objekat! xx.g(); // ovako moe; p=xx.f(xx,xx); // i ovako moe, // ali se izraz "xx" ne izraunava; } Statike funkcije predstavljaju operacije klase, a ne svakog posebnog objekta. Pomou njih se definiu neke opte usluge klase, npr. tipino kreiranje novih, dinamikih objekata te klase (operator new je implicitno definisan kao statika funkcija klase). Na primer, na sledei nain moe se obezbediti da se za datu klasu mogu kreirati samo dinamiki objekti:

12

class X { public: static X* create () { return new X; } private: X(); // konstruktor je privatan };

9. Prijatelji klasa
esto je dobro da se klasa projektuje tako da ima i "povlaene" korisnike, odnosno funkcije ili druge klase koje imaju pravo pristupa njenim privatnim lanovima. Takve funkcije i klase nazivaju se prijateljima (enlgl. friends). Prijateljske funkcije (engl. friend functions) su funkcije koje nisu lanice klase, ali imaju pristup do privatnih lanova klase. Te funkcije mogu da budu globalne funkcije ili lanice drugih klasa. Da bi se neka funkcija proglasila prijateljem klase, potrebno je u deklaraciji te klase navesti deklaraciju te funkcije sa kljunom rei friend ispred. Prijateljska funkcija se definie na uobiajen nain: class X { friend void g (int,X&); // prijateljska globalna funkcija friend void Y::h (); // prijateljska clanica druge klase int i; public: void f(int ip) {i=ip;} }; void g (int k, X &x) { x.i=k; // prijateljska funkcija moe da pristupa } // privatnim lanovima klase void main () { X x; x.f(5); g(6,x); }

// postavljanje preko lanice // postavljanje preko prijatelja

Globalne funkcije koje predstavljaju usluge neke klase ili operacije nad tom klasom (najee su prijatelji te klase) nazivaju se klasnim uslugama (engl. class utilities).

13

Nema formalnih razloga da se koristi umesto funkcije lanice.

globalna (najee prijateljska) funkcija

Postoje prilike kada su globalne (prijateljske) funkcije pogodnije:


funkcija lanica mora da se pozove za objekat date klase, dok globalnoj funkciji moe da se dostavi i objekat drugog tipa, koji e se konvertovati u potrebni tip; kada funkcija treba da pristupa lanovima vie klasa, efikasnija je prijateljska globalna funkcija; ponekad je notaciono pogodnije da se koriste globalne funkcije (poziv je f(x)) nego lanice (poziv je x.f()); na primer, max(a,b) je itljivije od a.max(b); kada se preklapaju operatori, esto je jednostavnije definisati globalne (operatorske) funkcije nego lanice.

"Prijateljstvo" se ne nasleuje: ako je funkcija f prijatelj klasi X, a klasa Y izvedena (naslednik) iz klase X, funkcija f nije prijatelj klasi Y. Prijateljske klase Ako je potrebno da sve funkcije lanice klase Y budu prijateljske funkcije klasi X, onda klasa Y deklarie kao prijateljska klasa (friend class) klasi X.

se

Tada sve funkcije lanice klase Y mogu da pristupaju privatnim lanovima klase X, ali obratno ne vai ("prijateljstvo" nije simetrina relacija):

class X { friend class Y; //... }; Prijateljstvo" nije ni tranzitivna relacija: ako je klasa Y prijatelj klasi X, a klasa Z prijatelj klasi Y, klasa Z nije automatski prijatelj klasi X, ve to mora eksplicitno da se naglasi (ako je potrebno). Prijateljske klase se tipino koriste kada neke dve klase imaju tenje meusobne veze. Pri tome je nepotrebno (i loe) "otkrivati" delove neke klase da bi oni bili dostupni drugoj prijateljskoj klasi, jer e na taj nain oni biti dostupni i ostalima (rui se enkapsulacija). Tada se ove dve klase proglaavaju prijateljskim. Na primer, na sledei nain moe se obezbediti da samo klasa creator moe da kreira objekte klase X: class X { public: //... private: friend class Creator; X(); // konstruktor je dostupan samo klasi Creator //... };

14

10. Zakljuak
Objektno orijentisano programiranje ini samu sr Jave. U stvari, svi Java programi su objektno orijentisani - to nije samo jedna od opcija, kakav je sluaj, na primer, u jeziku C++. Objektno orijentisano programiranje tako je vrsto ugradjeno u Javu da morate razumeti njegove osnovne principe pre nego to napiete i najjednostavniji program. Objektno orijentisano programiranje moan i prirodan uzor za pravljenje programa koji preivljavaju neizbene promene u ivotu svakog vanijeg softverskog projekta, ukljuujui zaetak, rast i starenje. Na primer, kad postignete da objekti budu dobro definisani, a pristup njima ist i pouzdan, glatko moete da odbacite ili zamenite delove nekog starijeg sistema.

11.Literatura
1. http://itc.wikidot.com/klase-objekti-i-clanovi-klase 2. J. Liberty, Programming C#, Fourth edition, OReilly and Associates, 2005. 3.. Prevod: C# programiranje, A. Dragosavljevi (ur.), Dobar plan, 2005.