









Studirajte zahvaljujući brojnim resursima koji su dostupni na Docsity-u
Zaradite bodove pomažući drugim studentima ili ih kupite uz Premium plan
Pripremite ispite
Studirajte zahvaljujući brojnim resursima koji su dostupni na Docsity-u
Nabavite poene za preuzimanje
Zaradite bodove pomažući drugim studentima ili ih kupite uz Premium plan
oop programiranje u c++-u, skripta za usmeni deo ispita
Tipologija: Skripte
1 / 15
Ova stranica nije vidljiva u pregledu
Ne propustite važne delove!










Inline funkcije ispred funkcije sadrže ključnu rec inline. Dobro za male funkcije koje se često koriste (na primer samo prosleđuju argumente drugim funkcijama), a cije je telo kratko. Inline funkcije stede vreme izvrsavanja programa na taj nacin sto prevodilac njihov kod umece u kod u svakoj tacki poziva. Na taj nacin umanjuje broj poziva funkcija.Takođe kompajler može da ignoriše inline****.
Primer:
inline double cube( const double s ) { return s * s * s; }
*const kazuje kompajleru da funkcija ne menja s.
Telo inline funkcije se pise direktno u definiciji klase, ili se u definiciji klase ispred dekleracije funkcije navede kljucna rec inline, a implementacija se navodi iza definicije klase (u .h fajlu).
class C { int i; public : int val () { return i; } // ovo je inline funkcija };
// ili:
class D { int i;
public : inline int val (); };
int D::val() { return i; }
Konstruktor Konstruktor je posebna funkcija klase koja ima isto ime kao I klasa (T() za klasu T), a sluzi da se definisu pocetne vrednosti podataka klase. Konstruktor se poziva u trenutku kreiranja objekta klase. Moze da bude bez argumenata ili da ima jedan ili vise argumenata. Konstruktor nema tip koji vraca. Konstruktor može da ima argumente proizvoljnog tipa. Unutar konstruktora, clanovima objekta pristupa se kao i u bilo kojoj drugoj funkciji clanici. Takodje, moguce je da postoji I vise od jednog konstruktora (Overloading funkcija), pri cemu svaki mora da ima razlicitu listi argumenata. Koji ce konstruktor biti pozvan odredjuje se na osnovu liste argumenata. Ukoliko u klasi nije definisan ni jedan konstruktor prevodilac ce nam definisati konstruktor bez argumenata (takozvani podrazumevani konstruktor).
Destruktor
Specijalna funkcija klase koja se implicitno poziva u trenutku kada se objekat klase brise iz memorije je destruktor. Destruktor nema tip koji vraca. Destruktor je funkcija bez argumenata I u klasi moze da postoji samo jedan destructor. Identifikator destruktora je isti kao identifikator klase , sa prefiksom ~ na pocetku (~T() za klasu T). Ukoliko se ne definise destructor, podrazumeva se destructor sa praznim telom. Destruktori se uglavnom koriste kada objekat treba da dealocira memoriju ili neke sistemske resurse koje je konstruktor alocirao; to je najcešce slucaj kada klasa sadrži clanove koji su pokazivaci. Posle izvršavanja tela destruktora, automatski se oslobadja memorija koju je objekat zauzimao. Da nema destruktora koji oslobadjaju memoriju doslo bi do njenog nestanka sto dovodi do toga da aplikacija “pada” (memory leak).
Ne poziva se ako se program završi sa exit ili abort.
Statički lokalni objekti: Konstruktori -Tačno jedanput, kada se dodje do mesta gde je objekat definisan Destruktori - Kada se main završava ili je pozvana exit funkcija. Ne poziva se ako se program završava sa abort.
Prijateljske funkcije su funkcije koje nisu članice klase, ali imaju pristup do privatnih članova klase. Prijateljske funkcije mogu da budu: globalne funkcije ili članice drugih klasa. Funkcija je prijateljska ako se u definiciji klase navede deklaracija funkcije sa ključnom reči friend ispred. Nevažno je da li se deklaracija prijateljske funkcije navodi u privatnom ili javnom delu klase.Prijateljska funkcija nema pokazivač this na objekat klase kojoj je prijatelj. Prijateljstvo je relacija koja reguliše pravo pristupa, a ne oblast važenja i vidljivost identifikatora. Funkcija može da bude prijatelj većem broju klasa istovremeno. U nekim situacijama su globalne prijateljske funkcije pogodnije od funkcija članica:
1. funkcija članica 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; 2. kada funkcija treba da pristupa članovima više klasa, efikasnija je prijateljska globalna funkcija; 3. ponekad je notaciono pogodnije da se koriste globalne funkcije (f(x)) nego članice (x.f()) ; na primer: max (a,b) je čitljivije od a.max(b) ; 4. kada se preklapaju operatori, često je jednostavnije definisati globalne (operatorske) funkcije nego članice.
class X { friend void g ( int X&); // prijateljska globalna funkcija friend void Y::h (); // prijateljska clanica h druge klase Y int i; public : void f( int ip) {i=ip;} }; void g ( int k, X &x) { x.i=k; // prijateljska funkcija moze da pristupa } // privatnim clanovima klase void main () { X x; x.f(5); // postavljanje preko clanice
g(6,x); // postavljanje preko prijatelja }
Treba biti oprezan pri koriscenju prijateljskih funkcija da se ne bi narusio concept inkapsulacije.
Ako je potrebno da sve funkcije èlanice klase Y budu prijateljske funkcije klasi X, onda se klasa Y deklariše kao prijateljska klasa ( friend class ) klasi X. Tada sve funkcije èlanice klase Y mogu da pristupaju privatnim clanovima klase X, ali obratno ne važi ("prijateljstvo" nije simetricna relacija):
"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 tipicno koriste kada neke dve klase imaju tešnje meðusobne veze. Pri tome je nepotrebno (i loše) "otkrivati" delove neke klase da bi oni bili dostupni drugoj prijateljskoj klasi, jer ce na taj naèin oni bitidostupni i ostalima (ruši se enkapsulacija). Tada se ove dve klase proglašavaju prijateljskim. Na primer, na sledeći način može se obezbediti da samo klasa Kreator može da kreira objekte klase X:
U jeziku C++, operatori za korisničke tipove (klase) su specijalne operatorske funkcije.
-operatori koji menjaju levi operand (npr. =) treba da vrate referencu na levi operand. -operatori koji biraju ili isporučuju operande (npr. [], ->, ()) obično treba da vrate referencu na izabranu vrednost. -operatori koji izračunavaju novu vrednost, a ne menjaju svoje operande (operatori nad bitovima, +, -, *, /, %, &, , ^, &&, ||, unarni (-, +), !~) obično treba da vrate kopiju lokalno kreiranog objekta. -preinkrement i predekrement - obično treba da vrate referencu na operand.
-postinkrement i postdekrement - obično treba da sačuvaju kopiju svog operanda, izmene operand i zatim vrate kopiju.
Svojstvo da svaki objekat izvedene klase izvršava metod taèno onako kako je to definisano u njegovoj izvedenoj klasi, kada mu se pristupa kao objektu osnovne klase, naziva se polimorfizam (engl. polymorphism ). Polimorfizam omogucava da klasa saopsti da ima isti interfejs kao i osnovna klasa ali da je ponasanje izvedene klase razlicito od ponasanja osnovne klase.Polimorfizam se postize deklarisanjem zeljenih funkcija osnovne klase virtualnim.Ako izvedena klasa ne definese virtualnu funkciju osnovne klase, ona jednostavno usvaja ponasanje osnovne klase.Virtualna funkcija je funkcija clanica koja ocekuje da bude redefinisana u nasledjenim klasama.
Pretpostavimo da smo projektovali klasu geometrijskih figura sa namerom da sve figure imaju funkciju crtaj() kao èlanicu. Iz ove klase izveli smo klase kruga, kvadrata, trougla itd. Naravno, svaka izvedena klasa treba da realizuje funkciju crtanja na sebi svojstven naèin (krug se sasvim drugaèije crta od trougla). Sada nam je potrebno da u nekom delu programa iscrtamo sve figure koje se nalaze na našem crtežu. Ovim figurama pristupamo preko niza pokazivaèa tipa figura*. C++ omoguæava da figure jednostavno iscrtamo prostim navodjenjem:
Iako se u ovom nizu mogu naci razlicite figure (krugovi, trouglovi itd.), mi im jednostavno pristupamo kao figurama, jer sve vrste figura imaju zajednicku osobinu "da mogu da se nacrtaju". Ipak, svaka od figura ce svoj zadatak ispuniti onako kako joj to i prilièi, odnosno svaki objekat ce "prepoznati" kojoj izvedenoj klasi pripada, bez obzira što mu se obraæamo "uopšteno", kao objektu osnovne klase. To je posledica naše pretpostavke da je i krug, i kvadrat I trougao takodje i figura.
class Izvedena : public Osnovna1, public Osnovna2, private Osnovna3 {/* ... */};
Konstruktori I destruktori – visestruko nasledjivanje
VIzv :: Izv1 :: Osnovna :: X
void VIzv :: fun() { x=2; // dvosmislenost, Izv1::X ili Izv2::X , Greška !!! Izv1::x = Izv2::x + 1; // ispravno }
Nije dozvoljeno da jedna klasa bude višestruka direktna osnovna klasa !!!
class A : public X, public X { }
-Identifikatori tipa - (formalni argumenti šablona) mogu da se koriste unutar generičke funkcije ili klase na svim mestima gde se očekuju tipovi. -Identifikatori konstante - mogu da se shvate kao simboličke konstante i da se koriste unutar generičke funkcije ili klase svuda gde se očekuju konstante. -Oznaka tipa - za simboličke konstante mogu da budu standardni ili korisnički tipovi podataka. -Odvojeno prevođenje šablona nema smisla – šabloni se smeštaju u *.h datoteke i uključuju tamo gde se koriste. -Mana šablona: pošto su u *.h datotekama – korisnik vidi celu implementaciju algoritama, a ne samo interfejs.
Funkcije na osnovu zadatog šablona se generišu:
-Kada naiđe na poziv funkcije za koju ne postoji definicija, a postoji odgovarajuća generička funkcija, prevodilac generiše odgovarajuću definiciju funkcije. -"Odgovarajuća generička funkcija" znači: stvarni argumenti se bez konverzije uklapaju u formalne argumente. -Generisanje na zahtev se postiže navođenjem prototipa sa tipovima stvarnih argumenata. -Pri pozivanju generisane funkcije vrše se uobičajene konverzije tipova. -Generisanje funkcije iz šablona će biti sprečeno ako se prethodno pojavi definicija odgovarajuće funkcije.
-Njoj se dostavlja pokazivač na funkciju koju treba da pozove funkcija terminate umesto funkcije abort. -Pokazivana funkcija mora biti bez argumenata i bez rezultata (void). -Vrednost funkcije set_terminate je pokazivač na staru funkciju koja je bila pozivana iz terminate. -Iz korisničke funkcije (pf) treba pozvati exit() za povratak u operativni sistem. -Pokušaj povratka sa return iz korisničke funkcije (pf) dovešće do nasilnog prekida programa sa abort().
typedef void (PVF) (); PF set_terminate(PVF pf);*
-Ako se u nekoj funkciji izazove izuzetak koji nije na spisku naznačenih izuzetaka, izvršava se funkcija:
void unexpected();
-Podrazumeva se da ova funkcija poziva funkciju terminate(). -Ovo se može promeniti pomoću funcije set_unexpected. -Njoj se dostavlja pokazivač na funkciju koju treba da pozove funkcija unexpected umesto terminate. -Pokazivana funkcija mora biti bez argumenata i bez rezultata (void). -Vrednost funkcije set_unexpected je pokazivač na staru funkciju koja je bila pozivana iz unexpected. -Pokušaj povratka sa return iz korisničke funkcije (*pf) dovešće do nasilnog prekida programa sa abort().
typedef void (PF) (); PF set_unexpected(PF pf);*
void fun() throw (iz1, iz2) { … }
ili
void f() { try { … } catch (iz1) {throw;}
catch (iz2) {throw;} catch (…) {unexpected();} }
Postoje 4 standardna toka (globalni statički objekti) :
cin – glavni (standardni) ulaz tipa istream (objekat klase istream_withassign). Standardno predstavlja tastaturu, ukoliko se drugačije ne specificira (da se izvrši skretanje glavnog ulaza unutar samog programa ili u komandi operativnog sistema za izvršavanje programa). cout – glavni (standardni) izlaz tipa ostream (objekat klase ostream_withassign). Predstavlja ekran, koristi se za ispisivanje podataka koji čine rezultate izvršavanja programa. cerr – standardni izlaz za poruke tipa ostream. Predstavlja ekran, obično se koristi za ispisivanje poruka o greškama. clog – standardni izlaz za zabeleške tipa ostream. Predstavlja ekran, koristi se za “vođenje evidencije” o događajima za vreme izvršenja programa.
Kao i kod ulaznog toka, i ovde se koriste iste operacije za otvaranje i zatvaranje toka ( open i close ). Za rad sa karakterima koristi se operacija put. Ona smešta zadati znak u izlazni tok. Na primer:
cout.put ('A');
daje isti rezultat kao i
cout << 'A';
Funkcija write
Funkcija write se koristi za upis bloka memorije u izlazni tok. Ona ima dva argumenta: prvi, char pokazivač i drugi, broj bajtova za upis. Treba napomenuti da je obavezna konverzija u char* pre adrese strukture ili objekta. Funkcija write se koristi i za binarne datoteke. Primer za upis strukture Radnik u binarnu datoteku :