Docsity
Docsity

Pripremite ispite
Pripremite ispite

Studirajte zahvaljujući brojnim resursima koji su dostupni na Docsity-u


Nabavite poene za preuzimanje
Nabavite poene za preuzimanje

Zaradite bodove pomažući drugim studentima ili ih kupite uz Premium plan


Školska orijentacija
Školska orijentacija


Objektno orijentisano programiranje skripta , Skripte od Objektno orijentisano programiranje

oop programiranje u c++-u, skripta za usmeni deo ispita

Tipologija: Skripte

2015/2016

Učitan datuma 25.12.2016.

Samurai.Sword
Samurai.Sword 🇸🇷

4.7

(7)

6 dokumenti

1 / 15

Toggle sidebar

Ova stranica nije vidljiva u pregledu

Ne propustite važne delove!

bg1
1. Inline funkcije
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.
2. Navesti načine za definisanje inline funkcija (dati primer za svaki od njih).
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;
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Delimični pregled teksta

Preuzmite Objektno orijentisano programiranje skripta i više Skripte u PDF od Objektno orijentisano programiranje samo na Docsity!

1. Inline funkcije

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.

2. Navesti načine za definisanje inline funkcija (dati primer za svaki od njih).

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; }

3. Konstruktori i destruktori.

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).

4. Vrste konstruktora (opis i namena).

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.

6. Prijateljske funkcije.

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.

7. Prijateljske klase.

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:

8. Operatorske funkcije.

U jeziku C++, operatori za korisničke tipove (klase) su specijalne operatorske funkcije.

  • Operatorske funkcije nose ime operator@, gde je @ neki operator ugrađen u jezik.
  • Operatorske funkcije preklapaju standaradne operatore (+, -, *, /, ...).
  • Operatorske funkcije se mogu koristiti u izrazima kao i operatori nad ugrađenim tipovima
  • Ako je operatorska funkcija definisana na gornji način izraz t1@t2 se tumači kao operator@(t1,t2):
  • Veze koje postoje između operatora za ugrađene tipove se ne podrazumevaju za redefinisane operatore.
  • Na primer, ako je definisan operator +, a+=b ne znači automatski a=a+b, (+= mora posebno da se definiše). • Kada se definišu operatori za klasu, treba težiti da njihov skup bude kompletan.
  • Na primer, ako su definisani operatori = i +, treba definisati i operator +=; ili, za == treba definisati i !=.

9. Nabrojati načine za realizaciju operatorskih funkcija i navesti primere.

  • Ako je @ neki binarni operator (na primer +), on može da se realizuje:
  1. Kao funkcija članica klase X (mogu se argumenti prenositi i po referenci): operator@ (X) Poziv a@b se sada tumači kao: a.operator@(b) , za funkciju članicu, ili
  2. Kao prijateljska globalna funkcija: operator@ (X,X) Poziv a@b se sada tumači kao: operator@(a,b) , za globalnu funkciju
  • Nije dozvoljeno da se u programu nalaze obe ove funkcije.

Unarni i binarni operatori

  • Unarni operator ima samo jedan operand, pa se može realizovati:
    1. kao operatorska funkcija članica bez argumenata: tip operator@ ()
  1. kao globalna funkcija sa jednim argumentom: tip operator@ (X x)
    • Binarni operator ima dva argumenta, pa se može realizovati
  2. kao funkcija članica sa jednim argumentom: tip operator@ (X xdesni)
  3. kao globalna funkcija sa dva argumenta: tip operator@ (X xlevi, X xdesni)

10. Povratna vrednost operatorskih funkcija.

-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.

11. Načini izvodjenja.

postoji nekoliko vrsta nasledjivanja: private, proteted i public. Zavisno od vrste nasledjivanja

ce se menjati i pristupacnost clanova izvedene klase. Na primer, ukoliko je pristupnost nekog

clana roditeljske klase public, i ukoliko se podklasa privatno izvede (private), onda ce

pristupnost tog istog clana u izvedenoj klasi biti private.

odnos "sastoji se od" znaci da izvedena klasa sadrzi kopiju osnovne i svu njenu

funkcionalnost, ali objekti izvedne klase ne mogu da se koristre u slucajevima kada se

zahtevaju objekti osnovne klase. Kod privatno izvedene klase javni clanovi osnovne klase

postaju privatni u izvedenoj klasi.

12. Objasniti polimorfizam.

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.

14. Višestruko izvodjenje

  • višestruko nasleđivanje ( multiple inheritance ) - klasa nasleđuje osobine više osnovnih klasa.
  • Primer: "motocikl sa prikolicom" je vrsta "motocikla", ali je i "vozilo sa tri točka". Pri tome "motocikl" nije "vozilo sa tri točka" niti je "vozilo sa tri točka" vrsta "motocikla".
  • Klasa se deklariše kao naslednik više klasa tako što se u zaglavlju deklaracije navode osnovne klase.
  • Ispred svake osnovne klase treba da stoji reč public, da bi izvedena klasa nasleđivala prava pristupa članovima.

class Izvedena : public Osnovna1, public Osnovna2, private Osnovna3 {/* ... */};

  • Može i private i protected.
  • Podrazumevani: private za klasu i public za struct

Konstruktori I destruktori – visestruko nasledjivanje

  • Sva pravila o nasleđenim članovima važe i kod višestrukog nasledjivanja.
  • Konstruktori osnovnih klasa se pozivaju pre konstruktora članova izvedene klase i konstruktora izvedene klase.
  • Konstruktori osnovnih klasa se pozivaju po redosledu deklarisanja.
  • Destruktori osnovnih klasa se izvršavaju na kraju, posle destruktora izvedene klase i destruktora članova. •Ako klasa ima višestruku nevirtuelnu osnovnu klasu X onda će objekti te klase Imati više podobjekata tipa X
  • Članovima osnovne klase X može se pristupiti nedvosmislenim navodjenjem njihove pripadnosti, korišćenjem operatora : :

VIzv :: Izv1 :: Osnovna :: X

  • Konverzija pokazivača tj reference na izvedenu klasu u pokazivač/referencu na višestruku osnovnu klasu može se izvršiti samo ako je nedvosmislena !!!
  • Nedvosmislenost znači da ne postoje dva ili više entiteta koja odgovaraju navedenom imenu

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 { }

15. Nacrtati i objasniti sintaksni dijagram za definisanje šablona.

-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.

16. Generičke funkcije

Funkcije na osnovu zadatog šablona se generišu:

  1. automatski - kad se naiđe na poziv generičke f-je sa stvarnim argumentima koji mogu da se uklope u šablon bez konverzije tipova argumenata. 2. na zahtev programera - navođenjem deklaracije (prototipa) za datu generičku f-ju sa željenim argumentima.

-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();} }

19. Nabrojati i opisati standardne tokove

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.

20. Operacije izlaznog toka.

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 :