03 Klase i Objekti

Embed Size (px)

Citation preview

  • 8/17/2019 03 Klase i Objekti

    1/54

    Objektno orijentisanoprogramiranje 1

    Klase i objekti

  • 8/17/2019 03 Klase i Objekti

    2/54

    18.10.2005.Klase i objekti2

    Klase i objekti – osnovni pojmovi Klasa je strukturirani tip koji obuhvata:

     – podatke koji opisuju stanje objekta klase i

     – funkcije namenjene definisanju operacija nad podacima klase Klasa je realizacija apstrakcije koja ima:

     – internu implementaciju i –  javni interfejs

    Jedan primerak (instanca, pojava) klase naziva se objektom te klase

    Podaci koji su deo klase nazivaju se: –   podaci članovi  klase (engl data members), polja ili atributi  

    !unkcije koje su deo klase nazivaju se: –   funkcije članice (engl member functions), primitivne operacije, metode

  • 8/17/2019 03 Klase i Objekti

    3/54

    18.10.2005.Klase i objekti3

    Komunikacija objekata Jedan od osnovnih principa "" programiranja:

     – objekti klasa komuniciraju (sara#uju) da ostvare slo$ene funkcije

    Poziv metoda se naziva upućivanjem poruke objektu klase "bjekat klase mo$e da menja svoje stanje predstavljeno atributima

    kada se pozove njegov metod, odnosno kada mu se uputi poruka "bjekat koji %alje poruku (poziva metod) naziva se objekat&klijent   "bjekat koji prima poruku ('iji se metod poziva) je objekat&server 

    z svoje metode objekat mo$e pozivati metodu drugog objekta – pozvana metoda mo$e biti 'lanica iste ili druge klase – tok kontrole prolazi kroz razne objekte koji komuniciraju

    *nutar metode, 'lanovima objekta 'ija je funkcija pozvanapristupa se navo#enjem njihovog imena

  • 8/17/2019 03 Klase i Objekti

    4/54

    18.10.2005.Klase i objekti4

    Prava pristupa (1) Klasa ima sekcije koje odre#uju pravo pristupa 'lanovima +vaka sekcija zapo'inje labelom sekcije (klju'na re')

    lanovi (podaci ili funkcije) klase iza klju'ne re'i private: – nazivaju se privatnim (engl private) 'lanovima: – za%ti-eni su od pristupa spolja (kapsulirani su) – njima mogu pristupati samo metode klase (i prijatelji)

    lanovi iza klju'ne re'i public:  – nazivaju se javnim (engl public ) 'lanovima:

     – dostupni su spolja bez ograni'enja lanovi iza klju'ne re'i protected: 

     – nazivaju se zaštićenim (engl protected ) 'lanovima: – dostupni su metodama date klase, kao i klasa izvedenih iz te klase – nisu dostupni ostalim funkcijama

  • 8/17/2019 03 Klase i Objekti

    5/54

    18.10.2005.Klase i objekti5

    Prava pristupa (2) .edosled sekcija public, protected i private je proizvoljan

     – preporu'uje se navedeni redosled

    /o$e biti vi%e sekcija iste vrste Podrazumevana sekcija (do prve labele) je privatna Preporuka je da se klase projektuju tako da nemaju javne atribute Kontrola pristupa 'lanovima nije stvar objekta, nego klase:

     – objekat neke klase iz svoje metode

    mo$e da pristupi privatnim 'lanovima drugog objekta iste klase Kontrola pristupa 'lanovima je odvojena od koncepta dosega imena:

     – najpre se, na osnovu oblasti va$enja imena i njihove vidljivosti, odre#uje entitetna koga se odnosi dato ime na mestu obra-anja u programu

     – zatim se odre#uje da li je tom entitetu dozvoljen pristup sa tog mesta

  • 8/17/2019 03 Klase i Objekti

    6/54

    18.10.2005.Klase i objekti6

    Definisanje klase (1)  0tributi (podaci 'lanovi):

     – mogu da budu samo deklarisani, a ne i definisani (nema inicijalizacije) – ne mogu da budu tipa klase koja se defini%e,

    ali mogu biti pokaziva'i ili reference na tu klasu /etode (funkcije 'lanice):

     – u definiciji klase mogu da se: deklari%u (navodi se samo prototip) ili defini%u (navodi se i telo)

     – funkcije koje su definisane u definiciji klase:

    mogu neposredno pristupati 'lanovima klase  12su inline funkcije – funkcije koje su samo deklarisane u definiciji klase:

    moraju biti definisane kasnije, izvan definicije klase mora se pro%iriti doseg klase (3ime4klase5::3ime4funkcije5)

     – vrednost rezultata, kao i argumenti mogu biti tipa klase koja se defini%e

  • 8/17/2019 03 Klase i Objekti

    7/5418.10.2005.Klase i objekti7

    Definisanje klase (2) 6efinicija klase mora biti prisutna tamo gde se klasa koristi

     – zato se definicija klase uobi'ajeno pi%e u datoteci zaglavlju (7h) Primer definicije klase:

    // definicija klase Complex:

    class Complex {  public:

      Complex dodaj(Complex); Complex oduzmi(Complex);float re(); float im();  private:  float real,imag;

    ; 8epotpuna definicija klase (bez tela) se naziva deklaracijom (class !;) Pre definicije klase:

     – mogu da se defini%u pokaziva'i i reference na tu klasu – ne mogu da se defini%u objekti te klase

  • 8/17/2019 03 Klase i Objekti

    8/5418.10.2005.Klase i objekti8

    Objekti (primerci) klase Primerci klase se defini%u na na'in

    koji je uobi'ajen za definisanje objekata standardnih tipova:

     – identifikator klase se koristi kao oznaka tipa, npr Complex c; 9a svaki objekat klase formira se poseban komplet

    svih nestati'kih atributa te klase 9a svaku metodu, postoji jedinstven skup

    lokalnih stati'kih promenljivih bez obzira na broj objekata te klase: – ovi objekti $ive od prvog nailaska programa na njihovu definiciju,

    do kraja programa – lokalni stati'ki objekti funkcija 'lanica imaju sva svojstva

    lokalnih stati'kih objekata globalnih funkcija

  • 8/17/2019 03 Klase i Objekti

    9/5418.10.2005.Klase i objekti9

    Podrazumevane operacije Podrazumevano je mogu-e:

     – definisanje objekata, pokaziva'a i referenci na objekte i nizova objekata klase –

    dodeljivanje vrednosti (operator"

    ) jednog objekta drugom – uzimanje adrese objekata (operator #) – posredno pristupanje objektima preko pokaziva'a (operator $) – neposredno pristupanje atributima i pozivanje metoda (operator %) – posredno pristupanje atributima i metodama preko pokaziva'a (operator &') – pristupanje elementima nizova objekata (operator ) –

    preno%enje objekata kao argumenata funkcija i to po vrednosti ili referenci – preno%enje pokaziva'a na objekte kao argumenata funkcija – vra-anje objekata iz funkcija po vrednosti ili referenci – vra-anje pokaziva'a na objekte

    8eke od ovih operacija korisnik mo$e redefinisati preklapanjem operatora

  • 8/17/2019 03 Klase i Objekti

    10/5418.10.2005.Klase i objekti10

    Pokaziva this (1)

    *nutar svake funkcije 'lanice postoji implicitni (podrazumevani, ugra#eni)lokalni pokaziva' t*is 

    ip ovog pokaziva'a je konstantni pokaziva' na klasu 'ija je funkcija 'lanica  0ko je klasa +, t*is je tipa +$const  "vaj pokaziva' ukazuje na objekat 'ija je funkcija 'lanica pozvana

    // definicija funkcije dodaj(Complex) metode klase Complex

    Complex Complex::dodaj (Complex c) {

      Complex t"$this; //u t se kopira objekat cija je f&ja pozvana

      t%real"c%real; t%imag"c%imag;  return t;

    //%%%

    void main(){ Complex c,c-,c.;%%% c"c-%dodaj(c.); %%%

  • 8/17/2019 03 Klase i Objekti

    11/5418.10.2005.Klase i objekti11

    Pokaziva this (2)

    Pristup 'lanovima objekta 'ija je metoda pozvana obavlja se neposredno mplicitno je to pristup preko pokaziva'a t*is i operatora &' 

    /o$e se i eksplicitno pristupati 'lanovima preko ovog pokaziva'a unutar metode// nova definicija funkcije dodaj(Complex) metode klase ComplexComplex Complex::dodaj (Complex c) {

      Complex t;

      t%real"this&'realc%real; t%imag"this&'imagc%imag;

      return t;

    Pokaziva' t*is je, u stvari, jedan skriveni argument funkcije 'lanice Poziv objekat%f() se prevodi u k;d koji ima semantiku kao f(#objekat) Primeri kori%-enja:

     – adresa teku-eg objekta je potrebna kao argument neke funkcije – teku-i objekat treba uklju'iti u listu

  • 8/17/2019 03 Klase i Objekti

    12/5418.10.2005.Klase i objekti12

    Konstantne metode (1) /etoda mo$e da samo 'ita stanje ili da menja stanje objekata /etode koje ne menjaju stanje objekta:

     –   inspektori  ili selektori  (engl inspector , selector ) /etoda koja menja stanje objekta:

     –   mutator  ili modifikator  (engl mutator , modifier )

    6obra praksa je da se korisnicima klase navededa li neka metoda menja unutra%nje stanje objekta

    6a je metoda inspektor, govori re' const iza zaglavlja funkcije "vakve metode nazivaju se konstantnim metodama

  • 8/17/2019 03 Klase i Objekti

    13/5418.10.2005.Klase i objekti13

    Konstantne metode (2) 6eklarisanje metode kao inspektora je:

     – samo notaciona pogodnost i stvar lepog pona%anja –

    to je obe-anje projektanta klase da funkcija ne menja stanje objekta – prevodilac nema na'ina da osigura da inspektor ne menja neke atribute inspektor mo$e da menja atribute uz pomo- eksplicitne konverzije,

    koja probija kontrolu konstantnosti

    * konstantnoj funkciji 'lanici tip pokaziva'a t*is  jeconst +$const, tako da pokazuje na konstantni objekat

    8ije mogu-e menjati objekat preko pokaziva'a t*is (a svaki neposredni pristup 'lanu je u stvari pristup preko t*is) 

    ako#e, za konstantne objekte klase nije dozvoljeno pozivatinekonstantnu funkciju 'lanicu

  • 8/17/2019 03 Klase i Objekti

    14/5418.10.2005.Klase i objekti14

    Konstantne metode ! primer class + {

      public:

     int

     citaj ()const

      {return

     i;

      int pisi (int j") { int t"i; i"j; return t;

      private:

      int i;

    ;

    + x; const + cx;

    x%citaj(); // u redu: konst% f&ja nekonst% objektax%pisi(); // u redu: nekonst% f&ja nekonst% objekta

    cx%citaj(); // u redu: konst% f&ja konst% objekta

    cx%pisi(); // 0 123!45: nekonst% f&ja konst% objekta

  • 8/17/2019 03 Klase i Objekti

    15/5418.10.2005.Klase i objekti15

    "epostojane metode +uprotnost konstantne metode je nepostojana (volatile) metoda

    int f() volatile {/$%%%$/

    Pri izvr%enju nepostojane metode f objekat ($t*is)mo$e promeniti stanje nezavisno od toka funkcije f 8epostojanost metode predstavlja napomenu prevodiocu

    da ne vr%i neke optimizacijeclass + {

     public:

      +(){kraj"false;

      int f() volatile { // da nije volatile, moguca optimizacija:   while(0kraj){/$%%%$/ // if (0kraj) while() {/$%%%$/

      // u telu (%%%) se ne menja kraj

      void  zavrseno(){kraj"true;

     private:

      int kraj;

  • 8/17/2019 03 Klase i Objekti

    16/5418.10.2005.Klase i objekti16

    Pojam konstruktora Konstruktor :

     – specifi'na funkcija klase koja defini%e po'etno stanje objekta

     – nosi isto ime kao i klasa – nema tip rezultata ('ak ni void) – ima proizvoljan broj argumenata proizvoljnog tipa

    Konstruktor se implicitno poziva prilikom kreiranja objekta *nutar tela konstruktora, 'lanovima objekta se pristupa

    kao i u bilo kojoj drugoj metodi Konstruktor, kao i svaka metoda, mo$e biti preklopljen

     – va$e ista op%ta pravila kao za preklapanje funkcija

  • 8/17/2019 03 Klase i Objekti

    17/5418.10.2005.Klase i objekti17

    Podrazumevani konstruktor  Podrazumevani konstruktor  (PK):

     – konstruktor koji se mo$e pozvati bez stvarnih argumenata

    Podrazumevani konstruktor: – nema formalne argumente ili – ima sve argumente sa podrazumevanim vrednostima

    *gra#eni podrazumevani konstruktor je: – bez argumenata i – ima pazno telo

    *gra#eni PK postoji samo ako klasa nije definisala ni jedankonstruktor 

    Kada se kreira niz objekata neke klase, poziva se PK za svaki element – redosled poziva PK elemenata je po rastu-em redosledu indeksa

  • 8/17/2019 03 Klase i Objekti

    18/5418.10.2005.Klase i objekti18

    Pozivanje konstruktora

    Konstruktor se poziva uvek kada se kreira objekat klase: – kada se izvr%ava definicija stati'kog objekta – kada se izvr%ava definicija automatskog objekta – kada se kreira dinami'ki objekat operatorom ne6 – kada se stvarni argument klasnog tipa prenosi u formalni

    (formalni argument se inicijalizuje stvarnim)

     – kada se kreira privremeni objekat, pri povratku iz funkcije(inicijalizuje se izrazom iz return naredbe)

  • 8/17/2019 03 Klase i Objekti

    19/54

    18.10.2005.Klase i objekti19

    #rgumenti konstruktora 8a mestu gde se kreira objekat mogu-e je navesti inicijalizator iza imena nicijalizator sadr$i listu stvarnih argumenta konstruktora u zagradama *koliko postoji samo jedan argument, mogu-a je i notacija sa simbolom " Poziva se onaj konstruktor koji se najbolje sla$e po broju i tipovima argumenata

    (kao kod preklapanja funkcija):class + {

     public:

      + ();

      + (double);

      + (char$);

    ;

    void  main () {

      double d"7%8;

      char $p"9iz znakova9;

      + a(d),b(p),c; // poziva se +(double),pa +(c*ar$),pa +()

  • 8/17/2019 03 Klase i Objekti

    20/54

    18.10.2005.Klase i objekti20

    Konstrukcija lanova (1) Pre izvr%avanja konstruktora pozivaju se konstruktori 'lanova

     – redosledom pojavljivanja u klasi nicijalizatori (argumenti ovih poziva) mogu da se navedu

    iza zaglavlja definicije (ne deklaracije) konstruktora, iza znaka : class  {

     public:

      (int j) {%%%

    ;

    class ++ { 

  • 8/17/2019 03 Klase i Objekti

    21/54

    18.10.2005.Klase i objekti21

    Konstrukcija lanova (2) 8avo#enje inicijalizatora u zaglavlju definicije konstruktora

    predstavlja specifikaciju inicijalizacije 'lanova

    nicijalizacija je razli'ita od operacije dodele koja se mo$e vr%iti jedino unutar tela konstruktora

    nicijalizacija je jedini na'in: – kada ne postoji podrazumevani konstruktor  – kada je 'lan konstanta – kada je 'lan referenca

  • 8/17/2019 03 Klase i Objekti

    22/54

    18.10.2005.Klase i objekti22

    Primer konstrukcije Primer konstrukcije dva objekta od kojih jedan sadr$i drugi:

     – objekat klase 4ontejner sadr$i objekat klase =eo,pri 'emu objekat deo treba da zna ko ga sadr$i

    class 4ontejner {  public:

    4ontejner () : deo(this) {%%%

      private:

    =eo deo;;

    class =eo{  public:

    =eo(4ontejner$ kontejner):moj4ontejner(kontejner) {%%%

      private:

    4ontejner$ moj4ontejner;;

  • 8/17/2019 03 Klase i Objekti

    23/54

    18.10.2005.Klase i objekti23

    $ksplicitni poziv konstruktora Konstruktor se mo$e pozvati i eksplicitno u nekom izrazu akav poziv kreira privremeni objekat klase

    pozivom odgovaraju-eg konstruktora sa navedenimargumentima

    sto se de%ava ako se u inicijalizatoru objektaeksplicitno navede poziv konstruktora:

    void  main () {  Complex c-(-,.%8),c.;

      c."c-Complex(7%8,&-%>); // privremeni objekat

      Complex c7"Complex(%-,>); // priv% obj% se kopira u c7

  • 8/17/2019 03 Klase i Objekti

    24/54

    18.10.2005.Klase i objekti24

    Konstruktor kopije (1) Pri inicijalizaciji objekta x- drugim objektom x. iste klase +:

     – podrazumevano se vr%i prosta inicijalizacija 'lanova x- 'lanovima x.

    Prosta inicijalizacija (kopiranjem) ponekad nije zadovoljavaju-a – na primer, ako objekti sadr$e 'lanove koji su pokaziva'i ili reference – tada programer treba da ima potpunu kontrolu

    nad inicijalizacijom objekta drugim objektom iste klase

    9a ovu svrhu slu$i konstruktor kopije (engl copy constructor ) Konstruktor kopije klase ++ se mo$e pozvati

    sa samo jednim stvarnim argumentom tipa ++ 

  • 8/17/2019 03 Klase i Objekti

    25/54

    18.10.2005.Klase i objekti25

    Konstruktor kopije (2) Konstruktor kopije se poziva

    kada se objekat inicijalizuje objektom iste klase, a to je:

     – prilikom inicijalizacije objekta (pomo-u znaka " ili sa zagradama) – prilikom prenosa argumenata u funkciju (kreira se lokalni objekat) – prilikom vra-anja vrednosti iz funkcije (kreira se privremeni objekat)

    Konstruktor ne sme imati formalni argument tipa svoje klase Konstruktor kopije ima argument tipa ++# ili const ++# "stali eventualni argumenti kopiraju-eg konstruktora

    moraju imati podrazumevane vrednosti

  • 8/17/2019 03 Klase i Objekti

    26/54

    18.10.2005.Klase i objekti26

    Primer konstruktora kopijeclass ++ {

     public:  ++ (int);

      ++ (const ++#); // konstruktor kopije  //%%%

    ;++ f(++ x-) {

      ++ x."x-; // poziv konst% kopije ++(++#) za x.  return x.; // poziv konst% kopije za privremeni

    // objekat u koji se sme?ta rezultat

    void  g() {

      ++ xa"7, xb"-;  xa"f(xb); // poziv konst% kopije samo za formalni

      // argument x-, a u xa se samo prepisuje

      // privremeni objekat rezultata, ili se // poziva ++::operator" ako je definisan

  • 8/17/2019 03 Klase i Objekti

    27/54

    18.10.2005.Klase i objekti27

    Konverzioni konstruktor  Konverziju izme#u tipova od kojih je barem jedan klasa – defini%e korisnik Korisni'ke konverzije -e se primenjivati automatski

    ako je jednozna'an izbor konverzije Jedna mogu-nost konverzije tipova je pomo-u konstruktora konverzije,

    ali odredi%ni tip mora biti klasa  0ko u klasi @ postoji @::@(A#), ili @::@(A)gde je A klasa ili standardni tip:

     – vrednost izraza @(t), gde je t tipa A, je privremeni objekat tipa @  – to predstavlja konverziju iz tipa A u tip @

     0utomatska konverzija mora biti neposredna: – za @::@(A#) i B::B(@#) mogu-e je samo eksplicitno B(@(t)) 8a ovaj na'in nije mogu-a konverzija u standardni tip:

     – ovaj nije klasa za koju korisnik defini%e konverzioni konstruktor  6ruga mogu-nost definisanja konverzija – preklapanje kast operatora

  • 8/17/2019 03 Klase i Objekti

    28/54

    18.10.2005.Klase i objekti28

    Primer konverzije konstruktorom Pri pozivu funkcije:

     – inicijalizuju se formalni argumenti stvarnim argumentima, uz eventualnu konverziju tipa – formalni argumenti se pona%aju kao automatski lokalni objekti pozvane funkcije

     – ovi objekti (ako su klasnih tipova) se konstrui%u pozivom odgovaraju-ih konstruktora Pri povratku iz funkcije:

     – konstrui%e se privremeni objekat koji prihvata vrednost return izraza na mestu poziva:

    class Aip {

    //%%% public:  Aip(int i); // konstruktor

    ;Aip f (Aip k) {

      //%%%  return .; // poziva se konstruktor Aip(.)

    void  main () {

      Aip k();  k"f(-); // poziva se konstruktor Aip(-)  //%%%

  • 8/17/2019 03 Klase i Objekti

    29/54

    18.10.2005.Klase i objekti29

    Destruktor (1) Destruktor: 

     – specifi'na funkcija 'lanica klase koja razgra#uje objekat – nosi isto ime kao klasa, uz znak  ispred imena – nema tip rezultata i ne mo$e imati argumente

    6estruktor se implicitno poziva pri prestanku $ivotnog veka objektaclass + {

     public:

      + () { coutDD9Eoziv destruktora klase +0Fn9;

    void  main () {  + x;

      //%%%

    // ovde se poziva destruktor objekta x GBG 000

  • 8/17/2019 03 Klase i Objekti

    30/54

    18.10.2005.Klase i objekti30

    Destruktor (2) +vaka klasa mo$e da ima najvi%e jedan destruktor  * destruktoru se 'lanovima pristupa kao i u bilo kojoj drugoj metodi Pri uni%tavanju dinami'kog objekta pomo-u operatora delete

     – destruktor klase objekta se implicitno poziva pre dealokacije memorije Pri uni%tavanju dinami'kog niza

     – destruktor se poziva za svaki element niza, po opadaju-em indeksu .edosled poziva destruktora je obratan redosledu poziva konstruktora 6estruktor se pi%e uvek kada objekat treba da dealocira memoriju

    koju je konstruktor alocirao est slu'aj potrebe za destruktorom – kada klasa sadr$i 'lanove koji su pokaziva'i

    Posle izvr%avanja tela destruktora – automatski se osloba#a memorija koju je sam objekat zauzimao

  • 8/17/2019 03 Klase i Objekti

    31/54

    18.10.2005.Klase i objekti31

    &tatiki (zajedniki) atributi Pri kreiranju objekata klase, za svaki se kreira poseban komplet atributa  0tribut mo$e biti deklarisan kao stati'ki pomo-u specifikatora static

    Postoji samo jedan primerak stati'kog atributa za celu klasu(zajedni'ki podatak za sve objekte klase)class + {

     private:  static int i; // postoji samo jedan i za celu klasu  int j; // svaki objekat ima svoj j

    ;

    +tati'ki atributi se koriste kada svi primerci jedne klasetreba da dele neku zajedni'ku informaciju

    Primer: – klasa defini%e listu objekata, a glava liste je zajedni'ki 'lan klase

  • 8/17/2019 03 Klase i Objekti

    32/54

    18.10.2005.Klase i objekti32

    Definisanje statikog atributa &tatiki atribut mora da se defini%e

     – izvan definicije klase

     – izvan definicija funkcija 'ak i privatni statiki atributi se moraju definisati izvan definicije klase definiciji statikog atributa moe da se koristi samo konstantan izraz Dodela inicijalne vrednosti statikom atributu se vr%i pre poziva main() 

    Obra*anje statikom atributu van klase vr%i se preko operatora :: int X::i=5;

  • 8/17/2019 03 Klase i Objekti

    33/54

    18.10.2005.Klase i objekti33

    &tatiki atributi i globalni objekti +tati'ki atribut ima $ivotni vek kao i globalni stati'ki objekat:

     – nastaje na po'etku i traje do kraja programa

    +tati'ki atribut ima sva svojstva globalnog stati'kog objekta,osim oblasti va$enja klase i kontrole pristupa

    9ajedni'ki 'lanovi smanjuju potrebu za globalnim objektima .azlike od globalnih objekata:

     – zajedni'ki 'lanovi logi'ki pripadaju klasi – doseg imena zajedni'kih podataka je klasa – zajedni'kim podacima je mogu-e ograni'iti pristup

  • 8/17/2019 03 Klase i Objekti

    34/54

    18.10.2005.Klase i objekti34

    +ajedniki atributi ! primeri Primer: glava liste

    class 3lement {

     public:

      static 3lement $glava;  //%% private:

      int vrednost;

      3lement $sledeci;

     ;

    Primer: vo#enje evidencije o broju kreiranih primerakaclass Gbjekat {

     public:  Gbjekat(){brojac;

      //%% private:

      static int brojac;

    ;

  • 8/17/2019 03 Klase i Objekti

    35/54

    18.10.2005.Klase i objekti35

    &tatike (zajednike) metode (1) /etode se deklari%u kao zajednike (za celu klasu),

    dodavanjem re'i static ispred deklaracije

    +tati'ke metode imaju sva svojstva globalnih funkcija,osim oblasti va$enja i kontrole pristupa

    &tatike metode ne poseduju pokaziva this +tati'ke metode ne mogu neposrednim imenovanjem

    pristupati nestati'kim 'lanovima klase

    +tati'ke metode mogu pristupati nestati'kim 'lanovima konkretnog objektakoji je formalni argument, lokalni ili globalni objekat

    +tati'ke metode mogu neposredno pristupati samo stati'kim 'lanovima

  • 8/17/2019 03 Klase i Objekti

    36/54

    18.10.2005.Klase i objekti36

    &tatike (zajednike) metode (2) +tati'ke metode se mogu pozivati za konkretan objekat

    (%to treba izbegavati)

    +tati'ke metode se mogu pozivati i pre stvaranja objekata,i to ovako: 3klasa5::3poziv5

    &tatike metode imaju samo jedan komplet lokalni- statiki- promenljivi-

    +tati'ke metode su operacije klase, a ne svakog posebnog objekta Primena: za op%te usluge klase Primer: dohvatanje glave liste ili broja 'lanova liste

  • 8/17/2019 03 Klase i Objekti

    37/54

    18.10.2005.Klase i objekti37

    &tatike metode – primer (1.1)class + {

      static int x; // staticki atribut  int 

  • 8/17/2019 03 Klase i Objekti

    38/54

    18.10.2005.Klase i objekti38

    &tatike metode – primer (1.2)int +::g () {

      int i"x; // nestaticka metoda moze da koristi

      int j"

  • 8/17/2019 03 Klase i Objekti

    39/54

    18.10.2005.Klase i objekti39

      O / O&tatike metode – primer (2) Primer:

     – za datu klasu mogu da se kreiraju samo dinami'ki objekti:class + {

     public:

      static +$ kreiraj () { return new +;  private:

      +(); // konstruktor je privatan;void  main() {  + x; // 0 123!45

      +$ px"+::kreiraj(); // moze

    Primena: – funkcija kreiraj moe ograniiti broj kreirani- objekata klase

  • 8/17/2019 03 Klase i Objekti

    40/54

    18.10.2005.Klase i objekti40

    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 (globalne ili metode drugih klasa) ili – cele klase

    akve funkcije i klase nazivaju se prijateljima (engl friends) Prijateljstvo, kao relacija izme#u klasa:

     – se ne nasle#uje – nije simetri'na relacija – nije tranzijentna relacija

    Prijateljstvo je relacija koja reguli%e isklju'ivo pravo pristupa,a ne oblast va$enja i vidljivost identifikatora

  • 8/17/2019 03 Klase i Objekti

    41/54

    18.10.2005.Klase i objekti41

    Prijateljske funkcije Prijateljske funkcije su funkcije koje nisu 'lanice klase,

    ali imaju dozvoljen pristup do privatnih 'lanova klase Prijateljske funkcije mogu da budu:

     – globalne funkcije ili – 'lanice drugih klasa

    !unkcija je prijateljska: – ako se u definiciji klase navede deklaracija funkcije sa klju'nom re'i friend

    8eva$no je pravo pristupa sekciji klase (privatno, za%ti%eno, javno)

    u kojoj se navodi deklaracija prijateljske funkcije Prijateljska funkcija nema pokaziva this 

    na objekat klase kojoj je prijatelj !unkcija mo$e da bude prijatelj ve-em broju klasa istovremeno

  • 8/17/2019 03 Klase i Objekti

    42/54

    18.10.2005.Klase i objekti42

    Prijateljske funkcije ! primer class + {

      friend void  g (int +#); // prijateljska globalna funkcija

      friend void  ::* (); // prijateljska metoda * druge klase

      int i;

     public:

      void  f(int ip) {i"ip;

    ;

    void  g (int k, + #x) {

      x%i"k; // prijateljska funkcija moze da pristupa

    // privatnim clanovima klase

    void  main () {

      + x;

      x%f(>); // postavljanje preko metode

      g(I,x); // postavljanje preko prijateljske funkcije

  • 8/17/2019 03 Klase i Objekti

    43/54

    18.10.2005.Klase i objekti43

    Prijateljske funkcije i metode Ponekad su globalne prijateljske funkcije pogodnije od metoda:

     – metoda mora da se pozove za objekat date klase,

    dok globalnoj funkciji mo$e da se dostavi i objekat drugog tipa,koji -e se konvertovati u potrebni tip – kada funkcija treba da pristupa 'lanovima vi%e klasa,

    efikasnija je prijateljska globalna funkcija – ponekad je notaciono pogodnije da se koriste globalne funkcije

    (f(x)) nego metode (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 metode

  • 8/17/2019 03 Klase i Objekti

    44/54

    18.10.2005.Klase i objekti44

    Prijateljske klase  0ko su sve metode klase  prijateljske funkcije klasi +,

    onda je  prijateljska klasa (friend class) klasi + class + {

      friend  ;//ako je klasa definisana ili deklarisana  friend class J; //ako J jos nije ni def% ni dek%;

    +ve metode klase  mogu da pristupaju privatnim 'lanovima klase + Prijateljske klase se tipi'no koriste

    kada neke dve klase imaju te%nje me#usobne veze Primer:

     – mo$e se obezbediti da samo klasa 4reator mo$e da kreira objekte klase +class + {

     private:  friend class 4reator;  +(); // konstruktor je dostupan samo klasi 4reator;

  • 8/17/2019 03 Klase i Objekti

    45/54

    18.10.2005.Klase i objekti45

    &trukture +truktura je klasa kod koje su svi 'lanovi podrazumevano javni

     – to se mo$e promeniti eksplicitnim umetanjem public: i private:

    struct a { isto ?to i: class a {

       public:  //%%% //%%%

     private:  private:

      //%%% //%%%; ;

    8a =>> struktura mo$e imati i funkcije 'lanice +truktura se tipi'no koristi:

     – za definisanje slogova podataka koji ne predstavljaju apstrakciju,odnosno nemaju pona%anje (nemaju zna'ajnije operacije)

    +trukture tipi'no poseduju samo konstruktore i eventualno destruktore

  • 8/17/2019 03 Klase i Objekti

    46/54

    18.10.2005.Klase i objekti46

    gne0ivanje klasa (1) Klase mogu da se defini%u i unutar definicije druge klase (ugne$#ene klase) 8a ovaj na'in se ugne$#ena klasa nalazi u oblasti va$enja okru$uju-e klase

    int x,

  • 8/17/2019 03 Klase i Objekti

    47/54

    18.10.2005.Klase i objekti47

    gne0ivanje klasa (2) +polja se imenu ugne$#ene klase mo$e pristupiti

    samo preko operatora razre%avanja oblasti va$enja ::

    @nutrasnja u; // 0 123!45: @nutrasnja nije u dosegu0

    !poljna::@nutrasnja u; // u redu;

    z spolja%nje klase do 'lanova unutra%njemogu- je samo pristup pomo-u %, &' i :: (obrnuto tako#e va$i)

    z unutra%nje klase mogu direktno da se koriste samo identifikatori: – tipova, – nabrojanih konstanti i – zajedni'kih 'lanova iz spolja%nje klase

    Pristup zajedni'kom 'lanu unutra%nje klase:3id spoljašnje5::3id unutrašnje5::3id zajedničkog člana5

  • 8/17/2019 03 Klase i Objekti

    48/54

    18.10.2005.Klase i objekti48

    gne0ivanje klasa () *gne$#ivanje je samo stvar oblasti va$enja,

    a ne i kontrole prava pristupa 'lanovima – okru$uju-a klasa nema nikakva posebna prava pristupa 'lanovima ugne$#ene – ni ugne$#ena klasa nema posebna prava pristupa 'lanovima spolja%nje klase

    *nutar definicije klase se mogu navesti i: – definicije nabrajanja (enum) iK t

  • 8/17/2019 03 Klase i Objekti

    49/54

    18.10.2005.Klase i objekti49

    okalne klase (1) ?okalne klase se defini%u unutar funkcija dentifikator lokalne klase ima doseg (oblast va$enja)

    od deklaracije do kraja bloka u kojem je deklarisan *nutar lokalne klase iz okru$uju-eg dosega

     je dozvoljeno samo kori%-enje: – identifikatora tipova – nabrojanih konstanti

     – stati'kih lokalnih i globalnih objekata – spolja%njih (eksternih) promenljivih i funkcija

  • 8/17/2019 03 Klase i Objekti

    50/54

    18.10.2005.Klase i objekti50

    okalne klase (2) /etode lokalne klase moraju da se defini%u unutar definicije klase ?okalna klasa ne mo$e da ima stati'ke (zajedni'ke) atribute

    int x;

    void f() {  static int s;  int x;  e!tern int g();  class Lokalna {  public:  int * (){ return x; // 123!45: x je automatska promenljiva  int j (){ return s; // G4: s je staticka promenljiva

      int k (){ return ::x; // G4: x je globalna promenljiva  int l (){ return g(); // G4: g() je spoljasnja funkcija  ;

    Lokalna $p " ; // 123!45: Lokalna nije u opsegu vazenja

  • 8/17/2019 03 Klase i Objekti

    51/54

    18.10.2005.Klase i objekti51

    Pokazivai na lanove klase 6odelom vrednosti pokaziva'u na 'lanove klase ozna'i se neki 'lan klase  0nalogija: kao %to se indeksom ozna'i komponenta niza

    Pokaziva' na 'lanove klase se defini%e:3tip 'lana klase5 3klasa5::$3identifikator pokaziva'a5 !ormiranje adrese 'lanova klase:

    3identifikator pokaziva'a5"#3klasa5::3'lan klase5 Pristup 'lanovima pomo-u pokaziva'a na 'lanove klase:

    3objekat klase5%$3identifikator pokaziva'a5 ili

    3pokaziva' na objekat klase5&'$3identifikator pokaziva'a5 "peratori %$ i &'$ su prioriteta @A i asocijativnost je sleva&udesno

  • 8/17/2019 03 Klase i Objekti

    52/54

    18.10.2005.Klase i objekti52

    Pokazivai na lanove klase ! primer class 5lfa {%%% public: int a, b; ;

    int 5lfa::$pc;// pc je pokazivac na int clanove klase 5lfa

    5lfa alfa,$beta;beta"#alfa;

    pc"#5lfa::a;// pc pokazuje na clanove a objekata klase 5lfa

    alfa%$pc " -; // alfa%a"-;

    beta&'$pc " -; // beta&'a"-;

    pc"#5lfa::b;// pc pokazuje na clanove b objekata klase 5lfa

    alfa%$pc " .; // alfa%b".;

    beta&'$pc " .; // beta&'b".;

  • 8/17/2019 03 Klase i Objekti

    53/54

    18.10.2005.Klase i objekti53

    3rafika notacija (4)*/? – *nified /odeling ?anguge

     – grafi'ka notacija za modeliranje softvera

    Klasa:

    "bjekat: krug0 : Krug

    acka

    B : doubleC : double

    rastojanje(t : acka) : double

    Krug

    Krug

    centar : ackar : double

    povrsina() : doublepopuni(boja : Doja)

  • 8/17/2019 03 Klase i Objekti

    54/54

    5elacije 0socijacija

    9avisnost

     0gregacija

    Kompozicija

    Krug acka

    @@

    &centar 

    @@

    "soba!akultet

    @n@

    &student

    @ @n

     0utomobil ocak

    A@ A@

    DojaKrug