Programski jezici 1
Document Sample


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
Get documents about "