OOP USMENI Flashcards
Faze u razvoju C++ programa (po redosledu).
Editovanje - Program je kreiran u editoru i zapamćen na disku
Preprocesiranje - Preprocesor program procesira programski kod
Compajliranje - Compajler kreira object code i smešta ga na disk.
Linkovanje - Linker linkuje object Code fajlove sa bibliotekama i kreira a.out fajl i smešta ga na disk
Učitavanje - Loader učitava program u memoriju
Izvršavanje - CPU uzima instrukciju po instrukciju i izvršava ih i pamti medjurezultate.
Specifikatori prava pristupa članovima klase.
public: Pristup omogućen svuda gde objekat klase ima scope
private: Pristup omogućen samo u funkcijama članicama
protected: Pristup omogućen u funkcijama članicama klase, kao i u izvedenim klasama
Kome su dostupne privatne funkcije?
Privatnim funkcijama mogu da pristupe funkcije članice te klase i prijatelji te klase.
Javnim članovima se može pristupiti kroz svaki objekat klase.
Kog tipa može biti povratna vrednost konstruktora?
Konstruktori nemaju povratni tip, čak ni void.
Klase imaju specijalnu funkciju članicu koja se zove konstruktor. Konstruktor ima isto ime kao i klasa (T() za klasu T), a služi da se definišu početne vrednosti podataka klase. Konstruktori kreiraju i inicijalizuju objekte. Poziva se u trenutku kreiranja objekta klase. Konstruktor može prihvatiti parametar, prema tabeli, ali ne može imati povratnu vrednost, čak ni void. Takođe, moguće je da postoji više od jednog konstruktora, pri čemu svaki ima različitu listu argumenata.
Za razliku od konstruktora, destruktor nema ni povratni tip, a ni parametre i on služi za brisanje objekata.
Specijalna funkcija klase koja se implicitno poziva u trenutku kada se objekat klase briše iz memorije je destruktor. Destruktor nema tip koji vraća. Destruktor je funkcija bez argumenata i u klasi može da postoji samo jedan destruktor. Identifikator destruktora je isti kao i identifikator klase, sa prefiksom ~ na početku (~T() za klasu T). Ukoliko se ne definiše destruktor, podrazumeva se destruktor sa praznim telom. Destruktori se uglavnom koriste kada objekat treba da dealocira memoriju ili neke sistemske resurse koje je konstruktor alocirao (najčešće kada klasa sadrži članove koji su pokazivači). Posle izršavanja tela destruktora, automatski se oslobađa memorija koju je objekat zauzimao. Da nema destruktora koji oslobađaju memoriju došlo bi do njenog nestanka što dovodi do toga da aplikacija pada (memory leak).
Da li je moguće preklopiti (overload): a) konstruktor b) destruktor?
Konstruktor je moguće preklopiti. Destruktor nije moguće preklopiti jer klasa može imati samo jedan destruktor.
Koji je maksimalni broj argumenata destruktora izvedene klase?
Nula jer destruktori nemaju argumente.
Kada se ne poziva destruktor nekog kreiranog objekta?
Globalni objekti
destruktor se ne poziva ako se program završava sa abort
Automatski lokalni objekti
destruktor se ne poziva ako se program završava sa exit ili abort
Statički lokalni objekti
destruktor se ne poziva se ako se program završava sa abort
Koja je namena operatora :: ?
Binarni rezolucioni operator (::) :
-‘’Vezuje’’ ime funkcije sa imenom klase;
-Jedinstveno identifikuje konkretne klase;
-Različite klase mogu imati funkcije članice sa istim imenima;
-Format za definisanje funkcija članica
PovratniTip ImeKlase::ImeFunkcijeČlanice( ){
…
}
-Ne zavisi da li je funkcija public ili private
-kod funkcija članica definisane unutar klase nije potrebno navoditi operator :: niti ime klase
Inline funkcije.
Inline funkcije ispred funkcije sadrže ključnu reč inline. Dobro za funkcije koje se često koriste (na primer samo prosleđuju argumente drugim funkcijama), a čije je telo kratko. Inline funkcije štede vreme izvršavanja programa na taj način što prevodilac njihov kod umeće u kod u svakoj tački poziva. Na taj način umanjuje broj poziva funkcija. Takođe, kompajler može da ignoriše inline. Primer inline double cube( const double s ) { return s * s * s; }
Kako kompajler poziva inline funkcije?
Tako što kopira njihov kod na svakom mestu poziva umesto da se generiše poziv funkcije.
Poziv konstruktora i destruktora statičkih lokalnih (globalnih) objekata.
Konstruktore i destruktore implicitno poziva kompajler.Zavisi od redosleda izvrsavanja i generalno, destruktori se pozivaju u suprotnom
redosledu od redosleda poziva konstruktora
Redosled poziva konstruktora i destruktora:
Globalni objekti
konstruktori - pre bilo koje druge funkcije (uključujući i main)
destruktori - kada se main završi (ili je pozvana funkcija exit)
destruktor se ne poziva ako se program završava sa abort
Automatski lokalni objekti
konstruktori - kada se objekti definišu (svaki put kada u toku izvršenja dobiju scope)
destruktori - kada objekti prestaju da važe, tj. kada izgube scope (kada se završi blok u kome je objekat definisan)
destruktor se ne poziva ako se program završava sa exit ili abort
Statički lokalni objekti
konstruktori - tačno jedanput kada se dođe do mesta gde je objekat definisan
destruktori - kada se main završi ili kada se pozove funkcija exit
destruktor se ne poziva se ako se program završava sa abort
Prednosti korišćenja klasa
- Jednostavnije programiranje
- Interfejs
- Ponovno korišćenje softvera
Razdvajanje interfejsa od implementacije
Prednosti:
-Lakse se modifikuju programi
Nedostaci:
- Header fajlovi
- Delovi implementacije(inline funkcije)
- Napomene o ostalim implementacijama(private clanovi)
- Visi stepen skrivanja koriscenjem proxy klase
Header fajlovi
- Definicija klasa i prototipova funkcija
- Uključuju se u svaki fajl koji koristi klasu #include
- Ekstenzija fajla .h
Kada se poziva konstruktor kopije?
Konstruktor kopije se poziva kada se objekat inicijalizuje objektom iste klase, a to je:
- Prilikom inicijalizacije objekata (pomoću operatora = ili sa zagradama)
- Prilikom prenosa argumenata u funkciju (kreira se lokalni automatski objekat)
- Prilikom vraćanja vrednosti iz funkcije (kreira se privremeni objekat)
- Kada kompajler generiše privremeni objekat
Kada se objekat x1 klase XX inicijalizuje drugim objektom x2 iste klase, C++ će podrazumevano izvršiti prostu inicijalizaciju redom članova objekta x1 članovima objekta x2. Međutim, to ponekad nije zadovoljavajuće pa, da bi programer imao potpunu kontrolu nad inicijalizacijom objekta drugim objektom iste klase, koristi se copy konstruktor.
Konstruktor kopije klase XX se može pozvati sa samo jednim stvarnim argumentom tipa XX.
Konstruktor kopije najčešće ima argument tipa XX& ili const XX&
Koji tipovi podataka mogu da predstavljaju povratni tip konstruktora za kopiranje?
Konstruktor ne može imati povratni tip, čak ni void.
Koliko argumenata može imati konstruktor kopije i šta važi za njih?
Konstruktor kopije ima jedan argument tipa XX& ili najčešće const XX&. Ostali eventualni argumenti copy konstruktora moraju imati podrazumevane vrednosti. Primer X(const X&, int a= 0); X(const X&, int); // ovo ne bi mogao da bude copy konstruktor
Šta mora da ima drugi argument konstruktora kopije?
Mora da ima podrazumevanu vrednost.
Navesti osobine relacije prijateljstva.
Ponekad se u praksi može javiti potreba da neki deo programa (funkcija, klasa itd.) pristupi nekim članovima date klase. Prijateljstvo je relacija koja reguliše pravo pristupa, a ne oblast važenja i vidljivost indentifikatora. Prijateljstvo se NE nasleđuje, NIJE simetrična i NIJE tranzitivna relacija!
U kom delu klase se definišu šablonske/prijateljske funkcije?
Šablonske funkcije se definišu u .h (header) datotekama i uključuju tamo gde se koriste. Mana je to što korisnik vidi celu implementaciju, a ne samo interfejs.
Prijateljske funkcije mogu da budu članice drugih klasa ili globalne funkcije. Nevažno je da li se deklaracija navodi u privatnom ili javnom delu.
Kako se definiše pokazivač this na objekat klase kojoj je prijatelj?
Prijateljska funkcija nema pokazivač this na objekat klase kojoj je prijatelj.
Koliko maksimalno parametara može imati globalna prijateljska funkcija?
Može imati maksimalno dva parametra od kojih je bar jedan argument tipa korisničke klase. Unarni operator ima samo jedan operand; binarni ima dva.
Kako se kreiraju imena operatorskih funkcija?
U jeziku C++, operatori za korisničke tipove (klase) su specijalne 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.
Ograničenja u preklapanju operatora
Osnovna pravila:
C++ dozvoljava preklapanje operatora (operator overloading), kao što dozvoljava i preklapanje imena funkcija.
Princip preklapanja omogućava da se definišu nova značenja operatora za korisničke tipove.
Postoje neka ograničenja u preklapanju operatora:
ne mogu da se preklope operatori ., .*, ::, ?: i sizeof, dok svi ostali mogu;
ne mogu da se redefinišu značenja operatora za primitivne (standardne) tipove podataka;
ne mogu da se uvode novi simboli za operatore;
ne mogu da se menjaju osobine operatora koje su ugrađene u jezik: n-arnost, prioritet i asocijativnost.
Kako treba realizovati funkciju Ocena operator+ (int rok, Ispit a)?
Ako je @ neki binarni operator (na primer +), on može da se realizuje:
- 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
- Kao globalna prijateljska funkcija: operator@ (X,X) Poziv a@b se sada tumači kao: operator@(a,b) , za globalnu funkciju
Treba je realizovati kao globalnu operatorsku prijateljsku funkciju klase Ispit.
Šta treba da vrate operatori koji menjaju levi operand?
Operatori koji menjaju levi operand (npr. =) treba da vrate referencu na levi operand.
Primer
X& operator = (X& x)
Operatori koji biraju ili isporučuju operande (operator [] ili -> ili ()) treba da vrate reference 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.
Navesti operatore za pristup članovima klase?
Članovima klase se pristupa pomoću dva operatora:
Operator tačka (.) - ovim operatorom se pristupa objektima ili referencama objekata. Operator pristupa clanu (.) se koristi na sledeci način: izraz.ime, gde ime predstavlja član objekta klase koji je predstavljen levim operandom izraz. Prema tome, levi operand mora biti objekat klase koji ima člana imenovanog desnim operandom.
Operator dereferenciranja pokazivača i pristupa članu (->) - ovim operatorom se pristupa pointerima, tačnije E1->E2 predstavlja člana E2 objekta na koji ukazuje E1.
Koji proces je suprotan procesu specijalizacije (ili generalizacije)?
U odnosu na veze kojima se izražava hijerarhija, nasleđivanje se posmatra u dva smera: generalizacija i specijalizacija.
Generalizacija je suprotan postupak od specijalizacije. Generalizacija je proces kojim se identifikuju i definišu zajednički atributi i funkcije u skupu objekata.
Specijalizacija je suprotan postupak od generalizacije u kome se za neki tip objekta definišu njegovi podtipovi koji imaju neka njima specifična svojstva.
Kako se definiše izvedena klasa?
Izvedena klasa se definiše navođenjem sledeće konstrukcije između identifikatora klase i znaka { :
SLIKA
Posle imena klase, stavlja se operator : . Opciono je da li će klasa biti virtuelno nasleđena iz druge, a zatim dolazi vrsta nasleđivanja (private, protected, public) od kojih zavisi vidljivost nasleđenih članova. Podrazumevani tip nasleđivanja je private.
Nacrtati i objasniti sintaksni dijagram za definisanje izvedene klase.
SLIKA
Posle imena klase, stavlja se operator : . Opciono je da li će klasa biti virtuelno nasleđena iz druge, a zatim dolazi vrsta nasleđivanja (private, protected, public) od kojih zavisi vidljivost nasleđenih članova. Podrazumevani tip nasleđivanja je private.