Professional Documents
Culture Documents
Klasa 4.4
Klasa 4.4
Kada budete razvijali sopstvene klase postavljacete sebi mnogo pitanja. Da li mi je potrebno mnogo
kopija konstruktora? Da li mi je neophodan podrazumevani argument u mojim konstruktorima? Kako da
obezbedim konverziju tipa za moju klasu? Da li mi je potreban operator jednakosti?Kako da
implementiram postfiksni operator?
U jeziku c++ klasa predstavlja tip podataka. Deklarisanjem klase definisete novi tip. Klasa predstavlja
strukturu koju su grupisani podaci I funkcije. Definicija klase se sastoji u navodjenjem svih clanova klase.
Namena
Definisite korisnicki tip ili klasu koja moze sadrzati I promenljive I funkcije
Sintaksa
{deklaracija
Public:deklaracija
Protected:deklaracija
Private:deklaracija
Uglaste zagrade pokazuju das u deklaracije osnovne klase I definicije objekta opcioni. Objekti jesu
pojedinacne pojave (instance) klase.Deklaracija osnovne klase se koristi u slucaju kada se definise klasa
nasledjivanja podakata I metoda te klase. Efekat kljucne reci class je isti kao unika rezervvisane reci
struct, izuzev sto je pristup clanovima klase podrazumeva privatan. Unutar neke od deklaracija mogu
biti deklracije promeljenljivih kao I /ili deklaracija funkcija. Podaci koji su deo klase nazivaju se podaci
clanovi klase (data members). Funkcija koje su deo klase nazivaju se funkcije clanice klase (memer
functions) ili metodi klase.
Deklarisanje klase
Da biste deklarisali klasu, upotrebite kljucnu rec class, pracenu imenom klase I otvorenom velikom
zagradom. Izmedju velikih zagrada se navodi lista podataka clanova I metoda klase. Zavrsite deklraciju
zatvarajucom zagradom I znakom tacka-zarez. Evo deklaracije klase koja je nazvana Cat
Class Cat
Void Miau();
}; moze I bez ovog ; zato sto je deklarisano u prethodnom redu ili () tacka zarez
Deklaracija ove klase ne alocira memoriju za klasu Cat. Ono samo saopstava kompajleru strukturu klase
Cat:podatke koje sadrzi (starost I tezina ) I metode klase (funkcija Miau ()). Ova deklaracija takodje
saopstava kompajleru koliko memorijskog prostora kompajler mora da rezervise za svaki objekat klase
Cat koji se kreira. U ovom primeru, ako celobrojna vrednost zahteva 2 bajta, klasa Cat zauzima samo 4
bajta: polje starost zauzima dva bajta, dok polje tezina zahteva druga 2 bajta. Funcija Miau()ne zauzima
U c++ u definisanje klasa sliucno je definisanju struktura u programskom jeziku C, a s tim da je kljucna
rec class, ne struct. U klasama je takodje potrebno zadati promenljive koje ce biti dostupne u celom
program. Takve promenljive zovemo javne I u C++ se zapisuju sa public.
Primer 1: u ovom primeru je kreirana klasa koja se zove Primer I koja sadrzi funkciju Ispis().
Funkcija Ipis() ispisuje tekst “ispis teksta na racunaru koriscenjem klase Ispis”
#include<iostream>
Class Primer /* deklracija klase koja se zove Primer I koja u sebi sadrzi funkciju Ispis()*/
Public:
Void Ispis()
};
Int main()
System (“PAUSE”);
Return 0;
Pojam klase
Mehanizam klasa omogucuje korisnicima da definisu sopstvene tipove podataka. Zbog toga se klase
cesto nazivaju I korisnicki definisani tipovi podataka. Klase se koriste kao sablon kojim se modeliraju
objekti slicnih svojstava, a objekti su konkretni primerci (instance) klase. Uocavanjem zajednickih
osobina (svojstava) objekata I njihovog grupisanja u klasu naziva se apstrakcija. Klasa sadrzi podatke
clanove (member data)I funkcije clanice ili metode (member functions). Podaci clanovi najcesce
predtavljaju unutrasnjost klase, tj. Njenu realizaciju, a funkcije clanice njen interfejs, odnosno ono sto se
moze raditi sa njenim objektima.
Klasa se deklarise pomocu kljucne reci class. Opsti oblik deklaracije klase je;
Ime klase postaje novi tip koji se moze koristiti za kjreiranje objekata klase (odnosno promenljivih koje
su tipa te klase). Iza deklracije klase mogu se navesti nazivi objekata, ali to nije obevezno. Klasa moze da
sadrzi private I javne clanove l standradno su svi clanovi klase privatni. To znaci d aim mogu pristupati
iskljucivo drugi clanovi iste klase. Na taj nacin postize se OO princip kapsuliranja ili skrivanja podataka.
Da bi se delovi klase ucinili javnim, tj. Da bi se omogucio pristup iz drugih delova programa, oni se
moraju deklarisati kao javni pomocu kljucne reci public. Klase se po pravilu projektuju tako da su podaci
clanovi privatni, a funkcije clanice javne.
Iako nema sintaksnog pravila koje to nalaze, dobro projektovana klasa trebalo bi da definise samo jednu
logicku celinu. Npr, u klasi koja cuva imena I telefonske brojeve ne bi trebalo da se nadju I informacije o
berzi, broju suncanih sati u godini, niti bilo sta drugo. Dobro projektovane klase grupisu logicki povezane
informacije.
Da ponovimo: u jeziku C++, klasa kreira nov tip podataka koji se moze koristiti za kreiranje objekata.
Klasa je logicki okvir koji definice vezu izmedju svojih clanova. Kada se deklarise promenljiva tipa klase,
zapravo se kreira objekat te klase I za njega se odvaja proctor u memorji.
Kao primer proucicemo klasu koja cuva informacije o vozilima , kao sto su automobili,kombiji I kamioni.
Tu klasu nazvacemo Vozil I u nju cemo smesti 3 podatka o vozilu: broj mesta za putnike, kapacitet
rezervoara za gorivo I prisecnu potrosnju goriva.
Pojam klase
Class Vozilo{
public:
};
Klasa Vozilo ima 3 podatka clana: putnici,rezervoar I potrosnja. Klasa Vozilo za sada nema funkcija
clanica; njih cemo dodati kasnije.
Tip promenljiva;
Dakle, podaci clanovi deklarisu se na slican nacin kao “obicne” promenljive. U klasi Vozilo ipsred svih
podataka clanova nalazi se specifikator javnog pristupa (public). To omogucuje d aim se pristupa iz koda
koji se nalazi izvan klase Vozilo. Definicja Klase kreira nov tip podataka, koji se u ovom slucaju zove
Vozilo. To ime se moze koristi za deklarisanje promenljivih tipa Vozilo, sto su zapravo objekti klase
Vozilo. Zapamtite da je deklaracija klase samo opis tipa I njome se ne prave stvarni objekat. Zbog toga
prethodna deklracija ne kreira nikakve objekte tipa Vozilo. Da bi se kreirao objekat. Zbog toga prethodna
deklracija ne kreira nikakve objekte tipa Vozilo. Da bi se kreirao objekat Vozilo, treba upotrebiti naredbu
za deklraciju sledeceg oblika:
Kreiranje objekata klase ponekad se zove I instanciranje klase. Kada se izvrsi ova naredba, kombi ce
postati primerak (objekat) klase Vozilo. Kad god se kreira primerak klase, kreira se objekat koji sadrzi
sopstvenu kopiju podataka clanova klase. To znaci da ce svaki objekat Klase imati svoje kopije
promenljivih (podataka clanova) putnici, rezervoar I potrosnja.
Operator tacka povezuje ime objekta sa njegovim podacima clanovima. Opsti oblik operatora tacka je:
Objekat.clan
Objekat se zadaje sa leve strane, a podatak clan sa desne. Npr, da bi se podatku clanu gorivo kombi
dodelila vrednost 50, koristi se sledeca naredba:
Kombi.gorivo = 50;
Operator tacka u opstem slucaju koristi se za pristup podacima clanovima I funkcijama clanicama klase.
Evo primera program koji koristi klasu Vozilo:
class Vozilo {
public:
int brojMesta;
int kapacitetRezervoara;
int potrosnja;
};
Vozilo kombi;
Vozilo automobile;
kombi.brojMesta=7;
kombi.kapacitetRezerboara=60;
kombi.potrosnja=7;
automobil.brojMesta=5;
automobil. kapacitetRezerboara=50;
automobi. potrosnja=5;
autonomijaKombi=kombi.kapacitetRezervoara/
kombi.potrosnja*100;
autonomijaAuto=automobil.kapacitet Rezervoara
automobil.potrosnja *100;
Cout<<”U kombi staje “<<kombi.brojMesta<<”putnika I s apunim rezervoarom
prelazi”<<autonomijaKombi<<”kilometara.”<<endl;
Return 0;
Rezultat izvrsavanja :
Vecina klasa osim podataka clanova ima I funkcije clanice. U opstem slucaju, funkcije clanice rade sa
podacima clanovima I komuniciraju sa drugim delovima programa. Funkcija main() u prethodnom
primeru racunala je autonomiju vozilo tako sto je kapacitet rezervoara delila potrosnjom. To je zadatak
koji tipicno treba da obavlja funkcija clanica klase, koju cemo sada dodati u klasu Vozilo zdavanjem
njenog prototipa u deklaraciji;
class Vozilo {
public:
int brojMesta;
int kapacitetRezervoara;
int potrosnjal
};
Posto se u deklraciji klase navodi samo prototip funkcije clanice, a ne I njena implementacija, na mestu
gde se pise implementacija funkcije clanice mora se navesti kojoj klasi ona pripada.Za tu svrhu se koristi
operator razresenja dosega(::);
Int Vozilo::autonomija(){
Return kapacitetRezervoara/potrosnja*100;
};
Operator razresenja dosega:: povezuje ime klase sa nazivom njene funkcije clanice da bi kompajler znao
na koju klasu se odnosi funkcija clanica. Posto vise razlicitih klasa mogu da imaju funkcije clanice istog
imena,operator:: je neophodan prilikom implementacije funkcije clanice. U ovom slucaju, operator
razresavanja dosega povezuje funkciju autonomija() sa klasom vozilo, odnosno deklarise da je funkcija
autonomija() u dosegu klase Vozilo, odnosno deklarise da je funkcija autonomija() u dosegu klase Vozilo.
Telo funkcije autonomija ima samo jednu naredbu; posto svaki objekta tipa Vozilo ima sopstevnu
vrednost podataka clanova kapacitetRezervoara I potrosnja, izracunava ce se autonomija za svaki
objektak posebno.
Primetite da je sintaksa definije funkcije clanice takva da se prvo navodi njen povratni tip.
Postoje dva nacina pozivanja funkcije clanice. Akose ona poziva iz koda koji se nalazi izvan klase, mora
se pozivati preko nekog objekta I operatora tacka
Kombi.autonomija();
Kada se pozove na ovaj nacin, funkcija autonomija() radi sa vrednostima podataka clanova objekta
kombi. Drugi nacin pozivanja funkcije clanice je iz druge funkcije clanice iste klase. Kada jedna funkcija
clanice klase poziva drugu funkciju clanicu klase to moze da uradi direktno, bez operatora tacka, jer
kompajler vec zna sa kojim objektnom radi.
Funkcije clanice se u nekim drugim OO programskim jezima zovu metode. Metode se izvsavaju kao
odgovor na poruke (messages) koje se salju njekom objektu. Poruka je, u sustini,poziv funkcije, clanice
od strane nekog objekta.
Primer:
Class Time{
Public:
Time ();
Void printMilitarty();
Void printStandard();
Private :
Int sat;//0-23
U prethodnom primeru postoji funkcija clanica sa istim imenom kai I sama klasa.Ta funcija clanica
naziva se konstruktor.
Konstruktor je specijalna funkcija clanica koja automaski poziva prilikom kreirnaja objekta I sluzi da bi se
inicijalozvali podaci clanice prilikom reiranja tog objekta. Moguce je da se klasa ima vise konstruktiora
(preklapanje imena funcija). Konstruktor ne vraca nikakav tip (cak ni void!)
Objekti se uvoide u program preko deklracija. U nekim slucajevima, kompajler moze da generise kod koji
kreira objekte za sopstvene potrebe. Objektima se dodeljuje ime (naziv) prilikom deklarisanja.
Imenovani objekti mogu se koristiti samo u oblastima vazenja (engl. Scopes;opseg vidljivosti) u kojima su
definisani. Objekti se mogu koristiti samo unutar oblasti u kojima su definisani.
Postoje tri vrste oblasti vazenja:lokalna oblast (eng local scope), koja obuhvata objekte definisane u
blokovima koda; oblast fajla (file scope), koja obuhvata objekte u fajlu, ali izvan svih blokova I klasa; I
oblast klase (class scope ), koja obuhvata objekte deklarisane kao podatke clanove klase. Objekti oblasti
fajla smatra se das u globalni.
Zivotni vek nekog objekta odredjen je njegovom klasom memorisanja (storage class)
Automatski. Objekti deklarisani unutar bloka smatra se das u automatski. Automatski objekti se
kreiraju I inicijalizuju svaki put kada kontrola toga dostigne svoju definiciju a unistavaju po
izlasku iz bloka
Staticki. Objekti sa prefiksom static su staticki I postoje I zadrzavaju svoje vrednosti u toku celog
izvrsavanja programa. Glovalni objekti su takodje staticni. Staticni objekti se kreiraju I inicijaliziju
pre prvog koriscenja bilo koje funkcije u konkretnoj translacionoj jedinici. Podrazume se das u
staticki objekti automastki inicijalizju na nulu.
Objekat u sirem smislu je definisano podrucje u memoriji podataka, u toku izvrsavanja programa.
Konstruktor se poziva kad kog se neki objekat kreira. Objekti se mogu kreirati: kao globalne promeljive,
kao lokalne promeljive, preko eksplicitnog koriscenja operatora new, preko eksplicitnog poziva
konstruktora iil privremi objekat. Konstruktori se takodje pozivaju kada se neki ojbkeat kreira kao deo
drugog objekta.
Slicno, kad vas objekat izadje iz oblasti vazenja, memorija koju je koristio taj objekat mora se “ocistiti”.
C++ Obezbedjuje specijalnu funkciju clanicu, tzv. Destructor, koja se poziva kad god se vas objekat
unistava tako da mozete da obavite bilo koji process ciscenja, kao sto je oslobadjanje memorije ili drugih
sistemskih resursa koje je koristio objekat.
C++ takodje obezbedjuje jos 2 specijlane funkcije koje imaju specijalnu ulogu. Kadgod neki objekat mora
da se koprira, uvodi se njegov konstruktor za kopiranje (eng. Copy constuctor). Konacno, kad god se
neko objektu dodeljuje vrednost, uvodi se njegov operator dodeljivanja.
Konstruktori
Konstruktori
*Funkcija clanica koja nosi isto ime kao I klasa naziva se konstruktor (engl. Constructor). Ova funkcija se
uvek poziva prilikom nastantka te klase.
*konstruktor nema tip koji vraca. Konstruktor moze da ima argument proizvoljnog tipa unutar
konstruktora, clanovima objekta pristupa se kao I u bilo kojoj drugoj funkciji clanici.
*konstruktor se uvek implicitno poziva pri nastanku objekta klase,odnosno na povetku zivotnog veka
svakog objekta date klase.
*konstruktor, kao I svaka funkcija clanica, moze biti preklopljenja (engl overloaded). Konstruktor koji se
moze pozvati bez stvarnigh arugmena nema fali
Primer:
Class x{
public:
x ();//konstruktor bez parametara
x(double);}
x(char*);
//…
};
Void maint () {
Double d=3.4;
Char *p=”niz znakova”
X a(d),// poziva se x(double)
b(p), ),// poziva se x(char*)
c;// poziva se x ()
}
Class XX {
Public:
XX(int);
Private:
YY y;
Int i;
Ovaj nacin ne samo da je moguc, vec je I jedino ispravan: navodjenje inicijalizatora u zaglavlju
konstruktora predstavalja specifikaciju inicijalizacije clanova (koji su ugradjenog tipa ili su objekti klase),
sto je razlicito od operacije double fali
* Konstruktor se moze pozvati I eksplicitno u nekom izrazu. Tada nastaje privremeni objekat klase
pozivom odgovarajuceg kkonstruktora sa nevedenim argumentima. Isto se desava ako se u inicijalizato
eksplicitno navede poziv konstruktora:
Podrazumevani konstruktor
Podrazumevani konstruktor je konstruktor koji nema argumenata. Podrazumevani konstruktor
Za klasu X ima oblik X::(). Konsktuktor koji ima sve podrazumevane argument, X::X(const int x=0), npr,
takodje je podrazumevani konstruktor, posto se on moze pozvati bez argument.
Podrazumevani konstruktori omogucavaju objektima da budu kreirani bez prosledjivanja bilo kakvih
parametara konstruktoru. Npr, deklaracija
String s;
Za rezultat daje string s, koji jos uvek nema vrednost; to je jedan prazan string.
Podrazumevani konstruktor obicno kreira objekat koji predstavlja null instance konkretnog tipa koji klasa
oznacava. Podrazumevani konstruktor za kompleksni broj moze rezultirati u objektu sa vrednoscu nula,
dok Podrazumevani konstruktor zca povezanu listu moze rezultovati praznom listom.
Cesto cete omoguciti korisnicima vasih klasa da prosledjuju argument konstruktoru. Bolje je da
obezbedite konstruktora
Konstruktor za kopiranje
Konstruktor za kopiranje je specijalni konstruktor koji moze da se pozove da kopira objekat. Konstruktor
za kopiranje za klasu X ima oblik X::(const X&). U sl fragmentu koda s2 se kreira pozivanjem string-ovog
konstruktora.
------------------------------------------------------------------------------------------------------------------------------------------
Preklapanje operatora u c++
Zato se usvajaju neke opste metode ciji su nazivi uvek isti!. Npr u Delphi-u sve metode za crtanje nose
naziv “Draw”.
Preklapanje operatora
OPERATOR THIS
Inline je zapravo zahtev za optimizaciju koda koji kompajler moze, ali ne mora da ispuni.
DEFINICIJA MAKROA
Direktiva #define se takodje moze korisiti da definice makroe sa parametrima. Makro je ime za naredbe I
izraze. Npr.
#define SQ(X) X*X