Programski jezici 1

W
Document Sample
scope of work template
							Elektrotehnički fakultet
Banja Luka




            Programski jezici 1

            KLASE I APSTRAKCIJA PODATAKA

            1. dio


                                         mr Dražen Brđanin




                                  2009
        Klase – 1. dio

Sadržaj
     Razlike C/C++ programiranja
     Osnovne karakteristike klase
     Definisanje klase
     Specifikatori pristupa članovima klase
     Razlike između definicije i deklaracije klase
     Oblast definisanosti i pristup članovima klase
     Pomoćne funkcije u klasi
     Modularizacija
     Inicijalizacija objekata – konstruktori
     Destruktori
     Redoslijed izvršavanja konstruktora i destruktora
          Osnovne razlike C i C++ programiranja

Programiranje u jeziku C                      Programiranje u jeziku C++
   Proceduralno (algoritamski)                  Objektno orijentisano
    orijentisano
                                                 Jedinica programiranja – KLASA
   Jedinica programiranja – FUNKCIJA
                                                 Programeri se koncentrišu na kreiranje
   Programeri se koncentrišu na pisanje          vlastitih tipova podataka – KLASE
    funkcija, funkcije se grupišu u
                                                 Imenice su te koje određuju sistem
    program
                                                  (imenice određuju klase)
   Podaci nisu primarni, oni su u funkciji
                                                 Svaka klasa sadrži podatke i funkcije za
    podrške akcijama koje funkcije izvode
                                                  manipulaciju podacima
   Glagoli određuju šta sistem radi i koje
                                                 Podaci koji se nalaze u klasi nazivaju se
    će funkcije biti implementirane
                                                  podaci članice (data members)
   Instance ugrađenih tipova
                                                 Funkcije koje se nalaze u klasi nazivaju
    (int, char, …) nazivaju se
                                                  se funkcije članice (metode)
    promjenljive (varijable)
                                                 Instance korisnički definisanih tipova
                                                  (klasa) nazivaju se objekti
         Osnovne karakteristike klase

KLASA omogućava modelovanje objekata, koje karakterišu:
      atributi (podaci članice – data members)
      ponašanje ili operacije (funkcije članice – member functions)

                                                   U nekim OO programskim jezicima
                                                  funkcije članice se nazivaju metode.


Najvažnije karakteristike KLASE kao pravog tipa podataka:
      OdreĎuju moguće vrijednosti objekata,
      OdreĎuju moguće operacije nad objektima,
      ObezbjeĎuju obaveznu inicijalizaciju objekata pri njihovom stvaranju,
      ObezbjeĎuju uništavanje objekata kada više nisu potrebni,
      ObezbjeĎuju enkapsulaciju atributa i ponašanja u jedinstevnu cjelinu,
      Omogućavaju princip skrivanja informacija (information hiding).
        Definisanje klase

                         Opšti oblik definicije klase
                            class Ime
  KLASA se definiše
 korišćenjem ključne        {
      riječi class.
                                            tip clan;   privatni članovi klase
Uobičajeno naziv klase                      …
  započinje velikim
       slovom.                   public:
                                            tip clan;    javni članovi klase
                                            …

                                 private:
                                            tip clan;   privatni članovi klase
                                            …
                            };
         Primjer definicije klase

                             class Razlomak
                             {

                                  public:

Funkcije članice najčešće                    Razlomak();
  su javni članovi klase                     void setBrojilac(int b);     javni članovi klase
                                             void setImenilac(int n);
                                             void printRazlomak();
                                             float vrijednost();

Podaci članice najčešće su        private:
  privatni članovi klase                     int brojilac;              privatni članovi klase
(skrivanje informacija)                      int imenilac;
                             };
           Specifikatori pristupa članicama klase

public                                           private
   Sve članice definisane iza specifikatora        Sve članice definisane iza specifikatora
    public: su javne.                                private: su privatne.

   Javna članica klase dostupna je iz bilo         Privatnoj članici klase ne može se pristupiti
    kojeg dijela programa u kojem je                 spolja, već samo iz unutrašnjosti klase.
    dostupan objekat date klase.                    Privatnoj članici klase pristupa se
   Javna članica dostupna je i iz                   posredstvom funkcija članica te klase.
    unutrašnjosti klase.                            Privatnoj članici klase mogu da pristupe i
   Uobičajeno su funkcije članice javne             tzv. prijatelji klase, tj. prijateljske
    članice klase (funkcije opisuju ponašanje,       funkcije klase.
    odnosno operacije nad objektima).               Uobičajeno su podaci članice privatni
                                                     članovi klase (princip skrivanja informacija).

Specifikatori pristupa:
                                                             Postoje i protected (zaštićeni)
    • mogu da mijenjaju mjesta,
                                                           članovi klase – primjenjuje se kod
    • mogu više puta da se navode,                                    nasljeđivanja.
    • ako se izostavi, podrazumijeva se private.
            Definicija klase <-> Deklaracija klase

   Definicija klase podrazumijeva              Deklaracija klase podrazumijeva
    navođenje svih članica klase.                da se samo naznači (deklariše) da
                                                 neki identifikator predstavlja klasu.
   Kad je klasa definisana, mogu se
    definisati (kreirati) i njene instance      Opšti oblik deklaracije klase:
    (objekat, niz objekata, upućivač,
    pokazivač na objekat).                             class Ime;
    Primjer:                                    Ako je poznata samo deklaracije klase ne
          Klasa objekat;                         mogu se instancirati objekti, već mogu
                                                 samo da se definišu pokazivači.
          Klasa niz[100];
          Klasa *pointer;
          Klasa &upucivac = objekat;
         Definicija funkcija članica klase

Funkcije članice mogu da se                 Funkcije članice mogu da se
definišu unutar klase.                      definišu izvan klase, ali se unutar
                                            klase treba navesti njihov prototip.
         Primjer:
             class Counter                           Primjer:
             {                                        class Counter
                private:                              {
                  int count;                      private:
                public:                                    int count;
                  ...                             public:
                  void print()                             ...
                  {                                        void print();
                    cout << count;                         ...
         }                                            };
                    ...
             };                                       void
                                             Counter::print()
Praksa pokazuje da je bolje unutar klase              {
navesti samo prototip, a funkciju članicu                cout << count;
        definisati izvan funkcije.                    }
           Oblast definisanosti i pristup članovima

   Članice klase dostupne su svim ostalim članicama date klase.
    Referenciraju se navođenjem imena članice.
   Izvan klase, članice klase mogu da se referenciraju pomoću:
        objekta - objekat.clanica
        pokazivača na objekat - pokazivac->clanica ili (*pokazivac).clanica
        upućivača na objekat - upucivac.clanica
   Promjenljive definisane u nekoj funkciji članici vidljive su samo u toj funkciji.
   Ako je unutar funkcije članice definisana promjenljiva sa istim imenom kao neki
    podatak član klase, onda lokalna promjenljiva maskira podatak član.
   Pristup maskiranom atributu preko operatora za razrješavanje dosega (::).
           Oblast definisanosti i pristup članovima
                           Podatak član x je javni atribut. Ovo treba izbjegavati!
Primjer:                        Ovdje je korišćeno samo radi ilustracije pristupa!

  #include <iostream.h>
  class Counter                                             7
  {                                                         8
      public:                                               10
          int x;
          void print() { cout << x << endl; }
  };
  main()
  {
      Counter c;          // kreira objekat c (instanca klase Counter)
      Counter *pc = &c;   // pointer na c
      Counter &uc = c;    // upucivac na c
      c.x = 7;            // postavlja vrijednost atributa objekta
      c.print();          // direktan poziv funkcije članice
      uc.x = 8;           // postavlja vrijednost pomocu upucivaca
      uc.print();         // poziv funkcije pomocu upucivaca
      pc->x = 10;         // postavlja vrijednost pomocu pointera
      pc->print();        // poziv funkcije pomocu pointera
  }
           Oblast definisanosti i pristup članovima
Primjer:
  #include <iostream.h>
  int x; // globalna promjenljiva                  Lokalno x: 1
  class Klasa                                      Atribut x: 100
  {                                                Globalno x: 0
      public:
          void set(int i) { x=i; }
          void primjer();
      private:
          int x; // podatak clan
  };
  void Klasa::primjer()
  {
      int x=1; // lokalna promjenljiva
      cout << "Lokalno x: " << x << endl;
      cout << "Atribut x: " << Klasa::x << endl;
      cout << "Globalno x: " << ::x;
  }
  main()
  {
      Klasa t;
      t.set(100);
      t.primjer();
  }
           Oblast definisanosti i pristup članovima
Primjer:
#include <iostream.h>                       void Time::printS()
class Time                                  {
{                                             cout << ((sat==12)?12:sat%12 ) << ":";
  public:                                     cout << (min<10 ? "0":"") << min << ":";
    void setTime(int, int, int);              cout << (sek<10 ? "0":"") << sek;
    void printM();                            cout << (sat<12 ? “AM" : “PM" );
    void printS();                          }
  private:                                  main()
    int sat, min, sek;                      {
};                                             Time t;
void Time::setTime(int   h, int m, int s)      t.setTime(13,27,6);
{                                              cout << "Vrijeme : ";
   sat = ( h >= 0 && h   < 24 ) ? h : 0;       t.printM(); cout<<" ili "; t.printS();
   min = ( m >= 0 && m   < 60 ) ? m : 0;       t.setTime(99,99,99);
   sek = ( s >= 0 && s   < 60 ) ? s : 0;       cout << "\nPokusaj : ";
}                                              t.printM(); cout<<" ili "; t.printS();
                                            }
void Time::printM()
{
  cout << (sat<10?"0":"") << sat << ":";       Vrijeme : 13:27 ili 1:27:06 PM
  cout << (min<10?"0":"") << min;              Pokusaj : 00:00 ili 0:00:00 AM
}
             Oblast definisanosti i pristup članovima

Privatnim članovima klase mogu da pristupe:
       funkcije članice date klase
                                                       Primjer:
       “prijateljske” funkcije date klase.
                                                         class Banka
Tipično se implementiraju sljedeće funkcije članice:     {
       za postavljanje atributa - tzv. set funkcija       private:
        npr. setTime, setMin, setSek                         float stanje;
                                                           public:
       za očitavanje atributa - tzv. get funkcija
                                                             ...
        npr. getSat, getMin, getSek
                                                             void setStanje(float ns)
                                                                   { stanje = ns; }
                                                                  float getStanje()
                                                                       { return stanje; }
                                                                  ...
                                                         };
                                                         ...
                                                         Banka racun;
                                                         racun.setStanje(0);
                                                         cout << racun.getStanje();
          Pomoćne funkcije u klasi

   Ne moraju sve funkcije članice da budu javne (pogotovo ako one nisu dio
    interfejsa klase).
   Ako neka funkcija služi kao pomoćna funkcija (helper ili utility function) u klasi,
    tako da npr. nešto računa ili slično za neku drugu funkciju članicu klase, tada
    takvu pomoćnu funkciju ostavljamo kao privatnu.
   Funkcije članice koje čine interfejs klase, odnosno omogućavaju pristup privatnim
    članovima klase nazivamo i pristupne funkcije (access functions).
   Funkcije članice koje provjeravaju ispunjenost nekog uslova (npr. da li je
    podatak ovakav ili onakav, da li je štampač spreman, da li je lift zauzet i sl.)
    nazivaju se predikatske funkcije (predicate functions).
           Modularizacija
U realizaciji većih programa preporučljivo je modularizovati kod.
Pri tome interfejs klase treba odvojiti od implementacije.
primjer.h (interfejs)                    primjer.cpp (implementacija)
#ifndef PRIMJER                          #include <iostream.h>
#define PRIMJER                          #include "primjer.h"
class Time                               void Time::setTime(int     h, int m, int s)
{                                        {
  public:                                   sat = ( h >= 0 && h     < 24 ) ? h : 0;
    void setTime(int, int, int);            min = ( m >= 0 && m     < 60 ) ? m : 0;
    void printM();                          sek = ( s >= 0 && s     < 60 ) ? s : 0;
    void printS();                       }
  private:                               void Time::printM()
    int sat, min, sek;                   {
};                                         cout << (sat<10?"0":"") << sat << ":";
#endif                                     cout << (min<10?"0":"") << min;
                                         }
projekat.cpp (glavni program)
                                         void Time::printS()
#include <iostream.h>                    {
#include "primjer.h"                       cout << ((sat==12)?12:sat%12 ) << ":";
main()                                     cout << (min<10 ? "0":"") << min << ":";
{                                          cout << (sek<10 ? "0":"") << sek;
   Time t; ...                             cout << (sat<12 ? “AM" : “PM" );
}                                        }
           Inicijalizacija objekata - KONSTRUKTORI

   Konstruktor – specijalna funkcija članica koja omogućava inicijalizaciju
    objekta prilikom njegovog kreiranja.
   Konstruktor ima isto ime kao i klasa kojoj pripada.
   Konstruktor nema tip – čak ni void!
   Konstruktor se automatski poziva svaki put kad se kreira neki objekat.
    Primjer:
      class Time
      {
          private:
             int hh, mm, ss;
         public:
             ...
             Time() { hh = mm = ss = 0; }
             ...
      };
      ...
      Time t;
           Inicijalizacija objekata - KONSTRUKTORI

   Iako programer eksplicitno ne poziva konstruktor pri kreiranju objekta, ipak je
    moguće u konstruktor prenijeti parametre kojima će se inicijalizovati atributi.
    Ovi parametri nazivaju se inicijalizatori i navode se unutar malih zagrada
    prilikom definisanja objekta. Inicijalizatori predstavljaju argumente koji se
    prosljeđuju konstruktoru.
    Primjer:                                   Klasa ne mora da ima konstruktor.
                                               Objekti mogu da se inicijalizuju drugim
      class Time                                       funkcijama članicama.
      {                                       Praksa pokazuje da je najbolje da se
          private:                            objekat inicijalizuje konstruktorom.
              int hh, mm, ss;
          public:
              Time(int h, int m, int s)
              {
                 hh=h; mm=m; ss=s;
              }
      };
      …
      Time podne(12,0,0), ponoc(0,0,0);
          Inicijalizacija objekata - KONSTRUKTORI

   Konstruktori mogu da se preklapaju – više konstruktora sa preklopljenim
    imenom u klasi, što omogućava različite načine inicijalizacije objekata
    (različita početna stanja).

        Primjer:
        class Time
        {
           private:
             int hh, mm, ss;
           public:
             Time(int h, int m, int s)
               { hh=h; mm=m; ss=s; }
             Time(int s)
               { hh=s/3600; mm=(s%3600)/60; ss=s%60; }
        };
        ...
        Time podne(12,0,0);
        Time petdo12(11,55,0);
        Time ponoc(0);
         Inicijalizacija objekata - KONSTRUKTORI

   Konstruktor može da ima i podrazumijevane vrijednosti argumenata.

        Primjer:
        class Time
        {
           private:
             int hh, mm, ss;
           public:
             Time(int h=0, int m=0, int s=0)
             {
                hh=h; mm=m; ss=s;
             }
        };
        …
        Time podne(12), ponoc, petdo12(11,55);
            Inicijalizacija objekata - KONSTRUKTORI

Podrazumijevane vrijednosti mogu da se        Podrazumijevane vrijednosti mogu da se
navedu u prototipu konstruktora – tada        navedu u definiciji konstruktora – tada
se ne navode u definiciji konstruktora!       se ne navode u prototipu konstruktora!
Primjer:                                      Primjer:
 class Time                                     class Time
 {                                              {
    private:                                      private:
       int hh, mm, ss;                               int hh, mm, ss;
    public:                                       public:
       ...                                           ...
       Time(int=0, int=0, int=0);                    Time(int, int, int);
       ...                                           ...
 };                                           };
 ...                                          ...
 Time::Time(int h, int m, int s)              Time::Time(int h=0, int m=0, int s=0)
 {                                            {
     hh=h; mm=m; ss=s;                             hh=h; mm=m; ss=s;
 }                                            }

           Nije dozvoljeno podrazumijevane vrijednosti navoditi i u prototipu i u
               definiciji konstruktora (isto važi i za ostale funkcije članice!)!
           DESTRUKTORI

   Destruktori – slično konstruktoru – još jedna specijalna funkcija članica klase
   Destruktor se poziva svaki put kad se uništava neki objekat.
   Destruktor suštinski ne uništava objekat (objekat će biti uništen i u slučaju da klasa
    nema definisan destruktor) - destruktor služi za “čišćenje memorije” (bitno kod
    objekata koji dinamički alociraju memoriju).
   Klasa može da ima samo jedan destruktor. Nije dozvoljeno preklapanje imena.
   Destruktor nema argumenata! Destruktor nema tip!
   Destruktor ima isto ime kao konstruktor, ali se ispred stavlja tilda (~).
    Intuitivno se može napraviti analogija sa bitskim operatorom negacije, jer se destruktor
    ponaša kao komplement konstruktora.

                             class Time
                             {
                                public:
                                   ...
                                   ~Time();
                                   ...
                             };
          Redoslijed konstruktora i destruktora

Konstruktori i destruktori se pozivaju automatski.
Redoslijed kojim se pozivaju ove funkcije zavisi od redoslijeda kojim se ulazi i izlazi iz
domena u kojem se objekti kreiraju. Generalno, destruktori se pozivaju
obrnutim redoslijedom u odnosu na poziv konstruktora.
Za globalne objekte:
     Konstruktor se poziva prije bilo koje funkcije (i prije main funkcije) – tj. prije
      početka izvršavanja programa. (u slučaju više fajlova, redoslijed izvršavanja konstruktora
      nije unaprijed poznat!)
     Destruktor se poziva nakon završetka izvršavanja main().

Za lokalne i automatske objekte:
     Konstruktor se poziva u trenutku kad se objekat definiše.
     Destruktor se poziva u trenutku napuštanja bloka u kojem je objekat definisan.

Za statičke objekte:
     Konstruktor se poziva samo jednom - prilikom definisanja objekta.
     Destruktor se poziva samo nakon završetka izvršavanja funkcije main.
         Redoslijed konstruktora i destruktora
                                            main()
#include <iostream.h>                       {
class KD                                       cout <<" (ulaz u main)”<< endl;
{                                              KD kd2(2);
   public:                                     cout <<" (main: lokalni)”<<endl;
      KD(int x)                                static KD kd3(3);
        {                                      cout <<" (main: staticki)”<<endl;
           data = x;                           create();
           cout << "Konst " << data;           KD kd4(4);
        }                                      cout <<" (main: lokalni)”<<endl;
     ~KD() { cout<<"Dest "<<data<<endl; }      cout <<"Izlaz iz programa”<<endl;
   private:                                 }
     int data;
};                                          Konst 1 (ulaz u main)
void create( void )                         Konst 2 (main: lokalni)
{                                           Konst 3 (main: staticki)
   KD kd5(5);                               Konst 5 (create lokalni)
                                            Konst 6 (create staticki)
   cout << " (create lokalni)" << endl;
                                            Konst 7 (create lokalni)
   static KD kd6(6);
                                            Dest 7
   cout << " (create staticki)" << endl;    Dest 5
   KD kd7(7);                               Konst 4 (main: lokalni)
   cout << " (create lokalni)" << endl;     Izlaz iz programa
}                                           Dest 4
                                            Dest 2
KD kd1(1); // globalni objekat              Dest 6
                                            Dest 3
                                            Dest 1

						
Related docs