ОО1/Питања — разлика између измена
< ОО1
Пређи на навигацију
Пређи на претрагу
(→Uvod) |
|||
(15 међуизмена истог корисника није приказано) | |||
Ред 9: | Ред 9: | ||
# Od koja dva dela se svaka klasa sastoji? - '''Ugovor (interfejs) i implementacija.''' | # Od koja dva dela se svaka klasa sastoji? - '''Ugovor (interfejs) i implementacija.''' | ||
# Šta su objekti (i u užem i u širem smislu)? - '''Objekti su primerci odgovarajućih klasa.''' | # Šta su objekti (i u užem i u širem smislu)? - '''Objekti su primerci odgovarajućih klasa.''' | ||
# Čime je određen objekat? - '''Stanjem, ponašanjem i identitetom.''' | |||
# Da li je polimorfizam statički ili dinamički mehanizam? - '''Dinamički.''' | # Da li je polimorfizam statički ili dinamički mehanizam? - '''Dinamički.''' | ||
# Šta je polimorfizam? - '''Ponašanje objekta ne zavisi samo od tipa pokazivača (upućivača) koji pokazuje na objekat već od tipa pokazivanog (upućivanog) objekta koji je poznat u vreme izvršenja.''' | # Šta je polimorfizam? - '''Ponašanje objekta ne zavisi samo od tipa pokazivača (upućivača) koji pokazuje na objekat već od tipa pokazivanog (upućivanog) objekta koji je poznat u vreme izvršenja.''' | ||
Ред 170: | Ред 171: | ||
# Šta se dešava ukoliko u izvedenoj klasi napiše metod koji ima isto ime kao metod iz osnovne klase? - '''Prema svojstvu polimorfizma se originalna metoda preklapa nadjača, odnosno za svaku izvedenu klasu se koristi nova definicija date metode. Koja metoda će se koristiti, stara ili nova, se određuje dinamički, za vreme izvršavanja programa.''' | # Šta se dešava ukoliko u izvedenoj klasi napiše metod koji ima isto ime kao metod iz osnovne klase? - '''Prema svojstvu polimorfizma se originalna metoda preklapa nadjača, odnosno za svaku izvedenu klasu se koristi nova definicija date metode. Koja metoda će se koristiti, stara ili nova, se određuje dinamički, za vreme izvršavanja programa.''' | ||
# Na koji način se može pristupiti sakrivenom polju osnovne klase? - '''U metodima izvedene klase se sakrivenim poljima osnovne klase pristupa pomoću <code>ime_osnovne_klase::clan.</code>''' | # Na koji način se može pristupiti sakrivenom polju osnovne klase? - '''U metodima izvedene klase se sakrivenim poljima osnovne klase pristupa pomoću <code>ime_osnovne_klase::clan.</code>''' | ||
# Kako se prilikom zaštićenog i privatnog izvođenja restaurira vidljivost svih metoda nekog imena, a kako samo pojedinačnog? - | # Kako se prilikom zaštićenog i privatnog izvođenja restaurira vidljivost svih metoda nekog imena, a kako samo pojedinačnog? - '''Svi metodi nekog imena se restauriraju pomoću <code>using osnovna_klasa::ime_metoda</code> (neće biti vidljivi metodi osnovne sa istim potpisom kao metodi izvedene klase). Ne može da se restaurira vidljivost pojedinačnog metoda osnovne klase.''' | ||
# Da li se konstruktori nasleđuju prilikom izvođenja? - '''Konstruktori osnovne klase se ne nasleđuju.''' | # Da li se konstruktori nasleđuju prilikom izvođenja? - '''Konstruktori osnovne klase se ne nasleđuju.''' | ||
# Šta se dešava kad se uvezu konstruktori? - '''Kada se svi konstruktori uvezu sa “using ime_klase::ime_klase” generišu se konstruktori izvedene klase sa istim potpisima, koji imaju prazno telo, ali se samo implicitno pozivaju konstruktore osnovne sa istim potpisom.''' | # Šta se dešava kad se uvezu konstruktori? - '''Kada se svi konstruktori uvezu sa “using ime_klase::ime_klase” generišu se konstruktori izvedene klase sa istim potpisima, koji imaju prazno telo, ali se samo implicitno pozivaju konstruktore osnovne sa istim potpisom.''' | ||
Ред 207: | Ред 208: | ||
== Izuzeci == | == Izuzeci == | ||
# Kog tipa može biti bačeni izuzetak? | # Kog tipa može biti bačeni izuzetak? - '''Izuzetak može biti objekat klase ili nekog drugog tipa.''' | ||
# Da li operator <code>noexcept</code> izračunava izraz i na koji način onda gleda tačnost? | # Da li operator <code>noexcept</code> izračunava izraz i na koji način onda gleda tačnost? - '''Izraz se ne izračunava, ali se u toku prevođenja proverava da li se može desiti izuzetak izračunavajući isti. Ukoliko izraz SIGURNO ne može izazvati izuzetak, tada noexcept operator vraća true, u suprotnom vraća false.''' | ||
# Kojim redosledom treba navoditi rukovaoce? | # Kojim redosledom treba navoditi rukovaoce? - '''Rukovaoci tipa izvedenog iz neke osnovne klase treba da se stave ispred rukovaoca tipa te osnovne klase, univerzalni rukovalac treba da se stavi na poslednje mesto.''' | ||
# Koji je životni vek bačenog objekta? | # Koji je životni vek bačenog objekta? - '''Životni vek bačenog objekta izuzetka je do kraja poslednjeg pozvanog rukovaoca.''' | ||
# Šta se dešava ukoliko je bačen lokalni objekat? | # Šta se dešava ukoliko je bačen lokalni objekat? - '''Izuzetak će biti njegova kopija.''' | ||
# Šta se dešava sa atributima klase ukoliko se desi izuzetak u konstruktoru koji propagira van konstruktora? | # Šta se dešava sa atributima klase ukoliko se desi izuzetak u konstruktoru koji propagira van konstruktora? - '''Oni se uništavaju, uključujući i nasleđene podobjekte.''' | ||
# Koja je svrha funkcijske naredbe <code>try</code>? | # Koja je svrha funkcijske naredbe <code>try</code>? - '''Koristi se u deklaraciji funkcije kako bi se omogućilo postavljanje rukovodilačkih '''(<code>catch</code>)''' blokova zajedno sa samom deklaracijom iste. Ovo se obično koristi kada želimo da uhvatimo izuzetak koji se može javiti prilikom inicijalizacije objekta unutar tela funkcije. ''' | ||
# Da li se u rukovaocima funkcijske naredbe <code>try</code> mogu koristiti parametri funkcije? | # Da li se u rukovaocima funkcijske naredbe <code>try</code> mogu koristiti parametri funkcije? - '''Da, mogu.''' | ||
# Šta moraju da urade rukovaoci funkcijske naredbe <code>try</code> na kraju svog izvršavanja? | # Šta moraju da urade rukovaoci funkcijske naredbe <code>try</code> na kraju svog izvršavanja? - '''Ukoliko se ne baca izuzetak ili funkcija nije '''<code>void</code>''', mora da se izvrši '''<code>return</code>''' koji vraća rezultat istog tipa kao i sama funkcija.''' | ||
# Da li se treba pristupati atributima i nasleđenom podobjektu unutar rukovaoca funkcijskog <code>try</code> bloka konstruktora? | # Da li se treba pristupati atributima i nasleđenom podobjektu unutar rukovaoca funkcijskog <code>try</code> bloka konstruktora? - '''Ne treba jer su posledice nepredvidive (neki još nisu inicijalizovani, a objekti one klase koji su već bili konstruisani, odgovarajući destruktor je uništio pre izvršenja rukovodioca).''' | ||
# Šta se dešava na kraju rukovaoca funkcijskog <code>try</code> bloka konstruktora? | # Šta se dešava na kraju rukovaoca funkcijskog <code>try</code> bloka konstruktora? - '''Izaziva novo bacanje izuzetaka (kao da je rukovodilac završen naredbom ''' <code>throw;</code>''')''' | ||
# Čemu je ekvivalentan modifikator <code>noexcept</code>? | # Čemu je ekvivalentan modifikator <code>noexcept</code>? - '''noexcept <=> noexcept(true) <=> throw()''' | ||
# Da li konstruktor sa funkcijskim <code>try</code> blokom sme imati <code>noexcept</code>? | # Da li konstruktor sa funkcijskim <code>try</code> blokom sme imati <code>noexcept</code>? - '''Ne sme.''' | ||
# Šta se dešava ukoliko se za neki izuzetak ne pronađe rukovalac? | # Šta se dešava ukoliko se za neki izuzetak ne pronađe rukovalac? - '''Izvršava se sistemska funkcija '''<code>[[noreturn]] void terminate() noexcept </code>. | ||
# Šta podrazumevano radi funkcija <code>terminate()</code> i da li je to moguće promeniti, i ukoliko je moguće šta ta alternativna funkcija mora na kraju da uradi? | # Šta podrazumevano radi funkcija <code>terminate()</code> i da li je to moguće promeniti, i ukoliko je moguće šta ta alternativna funkcija mora na kraju da uradi? - '''Podrazumevano poziva funkciju '''<code>abort()</code>''', koja daje kontrolu operativnom sistemu. To je moguće promeniti pomoću funkcije '''<code>set_terminate()</code>''' kojoj, kao argument, treba da se dostavi pokazivač na funkciju koju '''<code>terminate()</code>''' treba da pozove umesto '''<code>abort()</code>'''. Ta nova funkcija mora da pozove '''<code>exit(int)</code>''' ili '''<code>abort()</code>'''za povratak u operativni sistem. Pokušaj povratka sa return iz te nove funkcije će dovesti do nasilnog pozivanja '''<code>abort()</code>'''.''' | ||
# Da li ijedna metoda klase izvedene iz <code>std::exception</code> sme da baci izuzetak i zašto? - '''Ne sme, što se obezbeđuje sa 'noexcept', jer se lista izuzetaka ne sme proširiti.''' | |||
# Da li ijedna metoda klase izvedene iz <code>std::exception</code> sme da baci izuzetak i zašto? | |||
== Šabloni == | == Šabloni == | ||
Ред 231: | Ред 230: | ||
# Šta mogu biti formalni parametri šablona? - '''Formalni parametri šablona (između <>) mogu piti tipovi i konstante.''' | # Šta mogu biti formalni parametri šablona? - '''Formalni parametri šablona (između <>) mogu piti tipovi i konstante.''' | ||
# Kako se na zahtev generišu konkretne funkcije i klase iz šablona? - '''Funkcije se generišu navođenjem deklaracije funkcije sa argumentima šalona, dok se klase generišu na isti način, navođenjem argumenata šablona u deklaraciji klase.''' | # Kako se na zahtev generišu konkretne funkcije i klase iz šablona? - '''Funkcije se generišu navođenjem deklaracije funkcije sa argumentima šalona, dok se klase generišu na isti način, navođenjem argumenata šablona u deklaraciji klase.''' | ||
# Da li se implicitno mogu generisati konkretne funkcije i klase iz šablona i pod kojim uslovima? - '''''' | # Da li se implicitno mogu generisati konkretne funkcije i klase iz šablona i pod kojim uslovima? - '''Da mogu, ovo se odnosi na proces koji se naziva "implicitna instantijacija šablona". Kompajler može automatski generisati konkretne implementacije šablona kada mu bude potrebna, na osnovu upotrebe šablona u kodu.''' | ||
# Kada je neophodno eksplicitno navesti stvarne argumente šablona funkcije? - '''Pri generisanju na zahtev.''' | # Kada je neophodno eksplicitno navesti stvarne argumente šablona funkcije? - '''Pri generisanju na zahtev.''' | ||
# Kada će biti sprečeno automatsko generisanje funkcije iz šablona, a kako se može forsirati generisanje funkcije iz šablona? - '''Biće sprečeno ako se prethodno pojavljuje odgovarajuće definicija obične funkcije. Forsiranje generisanja funkcije iz šablona se postiže eksplicitnim navođenjem stvarnih argumenata šablona.''' | # Kada će biti sprečeno automatsko generisanje funkcije iz šablona, a kako se može forsirati generisanje funkcije iz šablona? - '''Biće sprečeno ako se prethodno pojavljuje odgovarajuće definicija obične funkcije. Forsiranje generisanja funkcije iz šablona se postiže eksplicitnim navođenjem stvarnih argumenata šablona.''' | ||
# Da li se pri generisanju klase iz šablona generišu i sve njene virtuelne metode? - '''Da.''' | # Da li se pri generisanju klase iz šablona generišu i sve njene virtuelne metode? - '''Da.''' | ||
# Da li se može imenovati klasa pri generisanju iz šablona? - '''Može, koristeći typedef ili using. | # Da li se može imenovati klasa pri generisanju iz šablona? - '''Može, koristeći typedef ili using. <code>typedef Vekt<char*, 100> VektorStr; using VektorRelanih = Vekt<float, 1000></code>''' | ||
<code>typedef Vekt<char*, 100> VektorStr; | |||
using VektorRelanih = Vekt<float, 1000></code>''' | |||
# Da li argumenti šablona mogu da imaju podrazumevane vrednosti i šta se dešava pri implicitnom zaključivanju kod šablonskih funkcija? - '''Mogu, pri implicitnom zaključivanju se podrazumevana vrednost može odrediti na osnovu stvarnih argumenata funkcije.''' | # Da li argumenti šablona mogu da imaju podrazumevane vrednosti i šta se dešava pri implicitnom zaključivanju kod šablonskih funkcija? - '''Mogu, pri implicitnom zaključivanju se podrazumevana vrednost može odrediti na osnovu stvarnih argumenata funkcije.''' | ||
# Da li se podrazumevane vrednosti argumenata moraju navesti i prilikom definicije svakog metoda šablonske klase ili je dovoljno samo jednom prilikom definicije/deklaracije klase? - '''Dovoljno je navesti ih samo jednom pri definiciji/deklaraciji klase. (slide 14 u “Generici)”''' | # Da li se podrazumevane vrednosti argumenata moraju navesti i prilikom definicije svakog metoda šablonske klase ili je dovoljno samo jednom prilikom definicije/deklaracije klase? - '''Dovoljno je navesti ih samo jednom pri definiciji/deklaraciji klase. (slide 14 u “Generici)”''' | ||
# Ako je formalni parametar šablona konstanta, kog tipa mora da bude? - '''Konstantni celobrojni izraz.''' | # Ako je formalni parametar šablona konstanta, kog tipa mora da bude? - '''Konstantni celobrojni izraz.''' | ||
# Iz kog razloga su samo konstantne dozvoljene kao parametri šablona, a ne i promenljive? - '''Unapređenje performanse izvršavanja (parametri se evaluiraju tokom prevođenja), unapređenje sigurnosti (statička analiza tokom prevođenja).''' | # Iz kog razloga su samo konstantne dozvoljene kao parametri šablona, a ne i promenljive? - '''Unapređenje performanse izvršavanja (parametri se evaluiraju tokom prevođenja), unapređenje sigurnosti (statička analiza tokom prevođenja).''' | ||
# Da li raniji formalni parametri se mogu koristiti za podrazumevane/početne vrednosti kasnijih parametara šablona? - '''''' | # Da li raniji formalni parametri se mogu koristiti za podrazumevane/početne vrednosti kasnijih parametara šablona? - '''Ne mogu, jer formalni parametri ne mogu zavisiti jedni od drugih, u smislu da se vrednost jednog parametra koristi za određivanje podrazumevane vrednosti drugog parametra.''' | ||
# Da li funkcije mogu biti parametri šablona i ako ne šta se u tom slučaju radi? - '''''' | # Da li funkcije mogu biti parametri šablona i ako ne šta se u tom slučaju radi? - '''Funkcije ne mogu biti parametri šablona, rešenje je funkcijska klasa (klasa za koju je definisan operator())''' | ||
# Kakvi su konstruktori inicijalizatorske liste? - '''Privatni, poziva ih samo prevodilac za stvaranje inicijalizatorske liste na osnovnu navedenih podataka.''' | # Kakvi su konstruktori inicijalizatorske liste? - '''Privatni, poziva ih samo prevodilac za stvaranje inicijalizatorske liste na osnovnu navedenih podataka.''' | ||
# Koje javne metode imaju inicijalizatorske liste? - '''<code>size()</code> (vraća broj elemenata liste) , <code>begin()</code> (vraća pokazivač na prvi nepromenljivi element liste), <code>end()</code> (vraća pokazivač iza poslednjeg elementa liste).''' | # Koje javne metode imaju inicijalizatorske liste? - '''<code>size()</code> (vraća broj elemenata liste) , <code>begin()</code> (vraća pokazivač na prvi nepromenljivi element liste), <code>end()</code> (vraća pokazivač iza poslednjeg elementa liste).''' |
Тренутна верзија на датум 8. јануар 2024. у 14:37
- Овај рок није решен. Помозите SI Wiki тако што ћете га решити.
Ispod su sakupljena razna pitanja sa prezentacija iz predmeta, neka bez rešenja. Namenjena su za obnavljanje gradiva pred kolokvijum/ispit, kako bi studenti mogli da testiraju svoje znanje odgovaranjem na njih.
Uvod
- Prilikom izvođenja, da li se stari programski kod mora menjati, opet prevoditi i opet testirati? - Ne.
- Šta je apstrakcija? - Prepoznavanje bitnih svojstava skupova sličnih objekata i predstavljanje zajedničkom klasom.
- Koja su 3 značajna napretka u evoluciji programskih jezika? - Apstrakcija izraza (FORTRAN), apstrakcija kontrole (Algol60) i apstrakcija podataka (Pascal).
- Od koja dva dela se svaka klasa sastoji? - Ugovor (interfejs) i implementacija.
- Šta su objekti (i u užem i u širem smislu)? - Objekti su primerci odgovarajućih klasa.
- Čime je određen objekat? - Stanjem, ponašanjem i identitetom.
- Da li je polimorfizam statički ili dinamički mehanizam? - Dinamički.
- Šta je polimorfizam? - Ponašanje objekta ne zavisi samo od tipa pokazivača (upućivača) koji pokazuje na objekat već od tipa pokazivanog (upućivanog) objekta koji je poznat u vreme izvršenja.
- Šta su objektno-bazirani jezici, a šta objektno-orijentisani? - Objektno-zasnovani jezici podržavaju: apstrakciju, kapsulaciju i modularnost. Objektno-orijentisani jezici dodatno podržavaju princip nasleđivanja.
- Da li je mehanizam obrade izuzetaka svojstven samo za objektno-orijentisane jezike? - Ne.
- Da li je mehanizam preklapanja operatora svojstven samo za objektno-orijentisane jezike? - Ne.
- Da li se mogu preklopiti svi operatori? - Ne.
- Da li je generički mehanizam statički ili dinamički? - Statički.
Proširenja C
- Šta je deklaracija, a šta definicija? - Deklaracija je iskaz koji samo uvodi neko ime (identifikator) u program i govori prevodiocu kojoj jezičkoj kategoriji pripada. Definicija je ona deklaracija koja: stvara objekat, navodi telo funkcije ili u potpunosti navodi strukturu korisničkog tipa.
- Koliko puta se smeju ponoviti deklaracije i definicije jednog istog objekta/funkcije/tipa? - U programu može da postoji samo jedna definicija (jednog objekta, funkcije, tipa) i proizvoljno mnogo deklaracija.
- Kakva može promenljiva da bude? - Prema dosegu: globalna ili lokalna. Prema veku trajanja: statička, automatska, dinamička, privremena (tranzijentna).
- Šta je l-vrednost, a šta d-vrednost? - L-vrednost (lvalue) je izraz koji upućuje na objekat (u širem smislu) ili funkciju. D-vrednost (rvalue) je izraz koji nije lvrednost.
- Da li uvek sa leve strane znaka = može da stoji l-vrednost? - Ne, mogu samo da stoje promenljive l-vrednosti, tj. svaka l-vrednost koja nije ime funkcije, ime niza, ili konstantan objekat.
- Koji operatori zahtevaju da im operandi budu l-vrednosti? - &, postfiksni: ++, - -, levi operandi dodele vrednosti
- Koji operatori bi trebalo da vrate l-vrednost? - unarni *, [ ], prefiksni ++, - -, operatori dodele vrednosti
- Koju oblast važenja imaju i koliko traju: lokalna imena, globalna imena, statički objekti, dinamički objekti, automatski objekti, privremeni objekti? - Automatski objekti: od definicije do napustanja oblasti vazenja, staticki objekat: od definicije do kraja izvrsavanja main-a, dinamicki objekat: zivotni vek kontrolise programer (stvaraju se pomocu new, brisu se pomocu delete). Privremeni objekat ima kratak i nedefinisan zivotni vek.
- Da li je moguće na neki način pristupiti globalnom imenu ukoliko je ono sakriveno od strane lokalnog imena, a lokalnom imenu u spoljašnjem bloku ukoliko je ono sakriveno od strane lokalnog imena u unutrašnjem bloku? - Globalnom imenu moguce je pristupiti pomocu ‘::’, a lokalnom imenu nije moguce pristupiti. (proveriti!!!)
- Da li se u uslovu if može definisati neka promenljiva i ako da kakva mora da bude i koliko ona traje? - Moze da se definise promenljiva, i njen vek trajanja je od definicije do kraja then, tj. else naredbe.
- Da li je unutar funkcije moguće imati promenljivu istog imena kao neki od parametara i ako ne koji je razlog? - Da, unutar funkcije je moguće imati promenljivu istog imena kao neki od parametara.
- Koju oblast važenja imaju članovi strukture/klase? Imaju oblast važenja te iste klase.
- Na koje sve načine se može pristupiti imenima članovima klase, van te klase? - Preko operatora: . (levi operand objekat), -> (levi operand pokazivač na objekat), :: (levi operand ime klase).
- Koju oblast važenja imaju labele? - Imaju oblast važenja funkcije u kojoj se navode.
- Da li je moguće sa goto naredbom preskočiti definiciju neke promenljive i skočiti na labelu koja se nalazi nakon nje? - Ne, nije moguće koristiti goto naredbu da preskočite definiciju promenljive u C++. goto naredba se može koristiti za skakanje na određenu oznaku (labelu) unutar iste funkcije ili bloka koda, ali ne može preskočiti definiciju promenljive. Definicija promenljive mora biti uključena u tok izvršavanja programa.
- Kada se kreiraju statički objekti? - Globalni staticki objekti, stvaraju se jednom, na pocetku izvrsavanja programa. Lokalni staticki objekti stvaraju se pri prvom nailasku toka programa na njihovu definiciju.
- Da li je C++ strogo ili labavo tipiziran jezik? - C++ je hibridan jezik, pri manipulisanju prostim tipovima je labavo tipizaran, dok sa slozenim korisnickim tipovima je strogo tipiziran.
- Koja je razlika između 4 kast operatora i kad se koji koristi? - Staticki kast koristi se za prenosive konverzije (izmedju numerickih tipova, kastova koje definise programer i nekih pokazivaca u void*), implicitno se vrsi kad je bezbedno. Reinterpretirajuci kast namenjen je za konverzije logicki neslicnih tipova (int i pokazivac, npr). Konstanta konverzija koristi se za dodavanje ili uklanjanje const. Dodavanje je sigurno, uklanjanje nije. Dinamicki kast jos postoji.
- Na koja dva načina možemo implementirati kastovanje (navesti mane ukoliko ih ima neki način)? - Static_cast i Dynamic_cast. Mana dynamic_cast-a je da se koristi u kontekstu polimorfizma i zahteva da klase imaju bar jedan virtualni metod. Takođe, dynamic_cast je sporiji od static_cast-a, jer uključuje provere u vreme izvršavanja (runtime checks) i može vratiti nullptr kada konverzija nije moguća.
- Šta radi operator decltype, da li računa izraz? - Decltype dodeljuje onaj tip podataka promenljivoj koji se se nalazi u zagradi decltype(izraz), ali taj izraz se nikad ne izracunava.
- Koja je bitna razlika između decltype i auto? - auto dodeljuje tip na osnovu izraza inicijalizatora (onoga sto se nalazi sa desne strane operatora dodele vrednosti), a decltype odredjuje na osnovu izraza u zagradi: decltype(izraz).
- Da li se auto može koristiti sa povratnom vrednosti funkcije i u kojim slučajevima? - Moze, bitno je da se funkcija koja vraca odredjeni tip pomocu return, bude pre toga definisana, a ne samo deklarisana.
- Kog je tipa string literal u C++ ("abcd")? - Tipa string.
- Kakvu razliku pravi pozicija gde se nalazi reč const u definiciji pokazivača? - Kad se const nadje ispred parametra koji je pokazivac, obezbedjuje se da funkcija ne menja objekat, a ispred tipa rezultata funkcije, obezbedjuje se nepromenljivost privremenog objekta rezultata.
- Na koje načine je moguće pristupiti imenu iz nekog prostora imena? - Razresenjem doksega: A::x; uvozom datog imena: using A::x; uvozom svih imena iz prostora imena: using namespace A.
- Da li je validno imati objekat istog imena kao i neki tip? - U jeziku C++, tehnički je dozvoljeno kreirati objekat sa imenom koje je isto kao ime nekog tipa.
- Da li je moguće imati isto ime (identifikator) za dve različite stvari u jednom prostoru imena, tj. da ime nije jednoznačno? - Nije moguce, mora da bude jednoznacno.
- Koji operatori su definisani za tipove nabrajanja (enum)? - Definisan je samo operator dodele vrednosti.
- Koje konverzije postoje za tipove nabrajanja? - Implicitna konverzija u osnovne tipove kao što su int, char, bool itd. Vrednost iz tipa nabrajanja može se eksplicitno konvertovati u druge tipove ili obrnuto koristeći statički kast (static_cast).
- Da li je moguće definisati koji tip koristi "under-the-hood" tip nabrajanja, da se ne koristi uvek int, i kako? - Moguce je, pomocu eksplicitnog navodjenja tipa koji se koristi za tipa nabrajanja (static_cast).
- Koja je razlika između običnog tipa nabrajanja i tipa nabrajanja sa ograničenim dosegom (enum class)? - Imena iz običnih tipova nabrajanja dele globalni opseg imena. Enumeracije sa ograničenim dosegom uvode lokalni opseg imena, što znači da imena enumeracija ne ulaze u globalni opseg imena.
- Kako se koristi incijalizatorska lista prilikom kreiranja unije? - Moze da se postavi samo prvo polje.
- Šta se dešava ukoliko inicijalizatorska lista sadrži više vrednosti nego što ima podataka ta struktura? - Visak je greska.
- Da li se inicijalizatorske liste mogu koristiti pri dodeli vrednosti? - Mogu.
- Kako se pristupa poljima bezimene unije/strukture? - Polja anonimnih unija i struktura se pristupaju direktno preko objekta koji ih sadrži.
- Da li je unija/struktura bezimena ako nema ime a ipak kreiramo bar jedan objekat ili pokazivač tog tipa? - Nije.
- Na koji način radi mutable polje? - Takvo polje moze da se menja cak i za nepromenljiv objekat strukture.
- Šta se dešava ukoliko operator new ne uspe da alocira memoriju jer nema dovoljno prostora? - Izbacuje se izuzetak bad_alloc.
- Šta se dešava ukoliko pokušamo da obrišemo nullptr sa delete operatorom? - Operator delete nema efekta.
- Šta vraća operator delete? Ne vraca rezultat (tip je void).
- Ukoliko dinamički alociramo matricu (više-dimenzioni niz, a ne niz nizova (
new Tacka[10][10]
)) da li dimenzije mogu biti promenljivi izrazi ili moraju biti konstante? - Sve dimenzije osim prve moraju da budu konstante, a taj promenljiv izraz mora da bude takav da moze da se izracuna u trenutku izvrsavanja naredbe sa operatorom new. - Da li je moguće napraviti niz referenci, pokazivač na referencu, referencu na pokazivač ili referencu na referencu? - Nije moguce napraviti niz referenci, referencu na referencu, pokazivac na referencu, ali je moguce napraviti referencu na pokazivac.
- Da li "moderna" verzija for-petlje (
for(tip prom: niz) naredba
) u svakom ciklusu petlje sadrži referencu ili kopiju tekućeg elementa niza, tj. da li promena objekta prom utiče na niz? - Sadrzi kopiju tekuceg elementa, a promena objekta prom ne utice na niz. - Da li je referenca na d-vrednost takođe d-vrednost ili je l-vrednost? - Referenca na d-vrednost je l-vrednost.
- Da li referenca na d-vrednost može upućivati na konstantnu/nepromenljivu d-vrednost? - Moze.
- Da li parametri funkcije mogu biti tipa reference na d-vrednost? - Mogu.
- Da li je dozvoljeno inicijalizovati referencu na d-vrednost pomoću l-vrednosti? - Nije.
- Gde treba da se nalazi deklaracija funkcije koja se neposredno ugrađuje (
inline
funkcije)? - Deklaracija funkcije koja se neposredno ugrađuje (inline funkcija) obično se nalazi u zaglavlju. - Kada se računaju podrazumevane vrednosti argumenata? - Ukoliko se pri pozivu funkcije ne navedu druge vrednosti argumenata.
- Da li je mehanizam preklapanja imena funkcije statički ili dinamički? - Staticki.
- Da li je dovoljno da se samo tipovi rezultata razlikuju da bi postojale dve funkcije istog imena? - Jeste.
- Da li rezultat ternarnog operatora može biti l-vrednost? - Moze.
- Da li su reinterpretirajuća i konstantna konverzija bezbedne? - Reinterpretirajuca konverzija nije bezbedna. Konstantna jeste ukoliko se dodaje const, nije ako se uklanja.
Klase i objekti
- Kako se formalnije nazivaju podaci i funkcije koji su deo klase? - Podaci = atributi, funkcije = metodi.
- Kako se naziva objekat koji poziva neki metod, a kako onaj čiji je metod pozvan? - Objekat koji poziva metod naziva se objekat-klijent, a objekat čiji se metod poziva je objekat-server.
- Da li može biti više sekcija vidljivosti iste vrste? - Može.
- Koja je podrazumevana sekcija, ako se ne navede nijedna druga? - Privatna (private).
- Da li atribut klase može biti tipa iste te klase, a šta važi ako je referenca ili pokazivač na taj tip? - Atributi ne mogu da budu tipa klase koja se definiše, ali mogu da budu pokazivači ili reference na tu klasu.
- Da li rezultati i parametri metoda mogu biti tipa iste te klase, a šta važi ako je referenca ili pokazivač na taj tip? - Vrednost rezultata, kao i parametri mogu da budu tipa klase čiji su članovi kao i tipa pokazivača ili reference na tu klasu.
- Na koji način možemo baratati sa objektima neke klase ukoliko imamo njenu deklaraciju, a ne i definiciju? - Pre definicije klase, a posle deklaracije mogu da se definišu pokazivači i reference na tu klasu, a ne mogu da se definišu objekti te klase.
- Koji operatori su ugrađeni, podrazumevani? - = & * . -> []
- Kog je tipa pokazivač
this
? - Tip ovog pokazivača je "konstantni pokazivač na klasu čiji je metod član". - Da li je dozvoljeno u metodi imati parametar istog imena kao i neki atribut te klase? - Da.
- Šta su metodi inspektori, a šta mutatori? - Metod koji ne menja stanje objekta je inspektor, a metod koji može i da menja stanje objekta je mutator.
- Kog je tipa pokazivač
this
u inspektor metodama? - const X*const - U koju svrhu se koristi modifikator
volatile
? - Kao napomena prevodiocu da ne vrši neke optimizacije jer objekat može da promeni stanje nezavisno od toka funkcije. - Da li je dovoljno da se dva metoda razliku samo u modifikatorima? - Da.
- Koji sve modifikatori postoje? - const, volatile, &, &&
- Koji je tip rezultata konstruktora? - Konstruktor nema tip rezultata (ni void).
- Da li konstruktor može imati parametar tipa te klase? - Ne može ako je jedini parametar.
- Kada se briše podrazumevani ugrađeni konstruktor? - Definisanjem nekog novog konstruktora se suspenduje ugrađeni.
- Da li je moguće kreirati niz objekata neke klase ukoliko ta klasa nema podrazumevani konstruktor? - Ne, jer se podrazumevani konstruktor poziva za svaki element niza.
- Da li je dozvoljeno ostaviti prazne zagrade pri definiciji automatskog objekta? - Nisu dozvoljene prazne zagrade () jer bi to bi se prevelo kao deklaracija.
- Koja je svrha
explicit
reči kod konstruktora? - Sprečavanje implicitne konverzije. - Kojim redosledom se izvršava incijalizacija atributa klase? - Redosledom navođenja u klasi.
- Da li atribut može da ima inicijalizator i u telu klase i u definiciji konstruktora? - Može. Ako atribut ima inicijalizator u telu klase i u definiciji konstruktora, primenjuje se inicijalizator iz definicije konstruktora.
- Kada je inicijalizacija atributa neophodna? - Inicijalizacija je neophodna: kada ne postoji podrazumevani konstruktor klase atributa, kada je atribut nepromenljiv podatak i kada je atribut referenca.
- Šta sme da postoji u listi incijalizatora kod delegirajućeg konstruktora? - Poziv drugog (ciljnog) konstruktora iste klase.
- Da li je prevodilac otkriva rekurzivno delegiranje (da se konstruktori ciklično pozivaju)? - Ne mora da je otkrije i tada se ulazi u beskonačnu rekurziju.
- Kako se implicitno briše kopirajući, a kako premeštajući konstruktor? - Kopirajući konstruktor implicitno se suspenduje pisanjem premeštajućeg konstruktora ili premeštajućeg operatora dodele. Ugrađeni premeštajući konstruktor se suspenduje ako se eksplicitno definiše: premeštajući konstruktor, kopirajući konstruktor, destruktor ili operator dodele.
- Kog tipa može biti parametar konstruktora kopije i da li može imati još parametara sa podrazumevanim vrednostima? - Konstruktor kopije ima parametar tipa XX& ili const XX&. Ostali parametri kopirajućeg konstruktora moraju da imaju podrazumevane vrednosti.
- Zašto se mora eksplicitno pisati premeštajući konstruktor ukoliko nam je potreban, tj. zašto nam nije dovoljan ugrađeni? - Zato što ugrađeni premeštajući konstruktor pravi plitku kopiju originala.
- Kog tipa može biti parametar konstruktora premeštanja i da li može imati još parametara sa podrazumevanim vrednostima? - Parametar premeštajućeg konst. je referenca na dvrednost: XX&&. Ostali parametri moraju da imaju podrazumevane vrednosti.
- Koji konstruktor se može pozvati ukoliko premeštajući ne postoji? - Ako u klasi ne postoji premeštajući, poziva se kopirajući konstruktor.
- Kog tipa rezultata je destruktor? - Nema tip rezultata.
- Da li destruktor može imati parametre i da li oni mogu imati podrazumevane vrednosti? - Ne može da ima parametre.
- Da li se destruktor može eksplicitno pozvati? - Može, npr. x.~X().
- Da li se statički atribut može i definisati u klasi, i koji slučaj je izuzetak? - U klasi se statički atribut samo deklariše, a definiše se na globalnom nivou. Izuzetak je imenovana celobrojna konstanta koja može da se definiše i u definiciji klase.
- Čime se inicijalizuje statički atribut ako se ne navede inicijalizator u definiciji? - Nulom.
- Da li se telo statičke metode može nalaziti u definiciji klase? - Može.
- Da li statičke metode mogu imati modifikatore? - Da.
- Šta se dešava ako preko konkretnog objekta pozovemo statički metod? - Klasa pokazanog objekta kao levog operanda se određuje statički.
- Da li je moguće pozvati statički metod ako nije kreiran nijedan objekat te klase? - Da.
- Koje osobine ima prijateljstvo među klasama? - Prijatelji klase mogu da pristupaju njenim privatnim članovima. Prijateljstvo je relacija koja reguliše isključivo pravo pristupa, a ne oblast važenja i vidljivost identifikatora. Prijateljstvo se ne nasleđuje, nije simetrična relacija i nije tranzitivna relacija
- Da li je moguće definisati prijateljsku metodu unutar definicije klase, da li se tad podrazumeva
inline
? - Ako se u definiciji klase navodi definicija prijateljske funkcije podrazumeva se inline. - Da li je bitno gde se oznaka prijateljstva nalazi, tj. u kojoj sekciji klase? - Nije.
- Da li prijateljska funkcija ima pokazivač
this
u sebi? - Prijateljska funkcija nema pokazivač this na objekat klase kojoj je prijatelj, - Da li prijateljske globalne funkcije mogu imati modifikatore, npr.
const
? - Modifikator nema smisla za globalnu prijateljsku funkciju. - Da li je moguća konverzija tipa nad kojim je pozvan objekat (skrivenog argumenta) u drugi tip? - Nije moguća konverzija skrivenog argumenta u drugi tip.
- Da li se doseg imena okružujuće klase proteže na ugnježdenu klasu i obratno? - Ugnežđena klasa (tip) se nalazi u dosegu imena okružujuće klase. Izvan okružujuće klase imenu ugnežđene klase može da se pristupi samo preko operatora proširenja dosega imena ::
- Da li je se u ugnježdenoj klasi može direktno pristupiti ne-statičkim poljima okružujuće klase? - Ne.
- Da li postoji neka relacija prijateljstva između ugnježdene i okružujuće klase? - Ugnežđena klasa je implicitno prijatelj okružujuće klase, ali okružujuća klasa nije prijatelj ugnežđene.
- Koju oblast važenja imaju lokalne klase? - Od deklaracije do kraja bloka u kojem je deklarisana.
- Da li je u lokalnoj klasi dozvoljeno pristupiti lokalnim promenljivama, a da li statičkim lokalnim promenljivama? - Dozvoljeno je samo pristupati statičkim lokalnim promenljivama.
- Da li metodi lokalne klase mogu da se definišu van definicije klase? - Ne. Metodi lokalne klase moraju da se definišu unutar definicije klase.
- Da li lokalna klasa može da ima statičke atribute? - Ne može.
Preklapanje operatora
- Koji operatori se ne mogu preklopiti? - Operatori ., .*, ::, ?:, sizeof, alignof, typeid i throw.
- Da li je moguće promeniti osobine operatora? - Ne mogu da se menjaju osobine operatora: n-arnost, prioritet i asocijativnost.
- Kako se pišu operatori ako se simbol operatora sastoji od slova (npr.
new
)? - Simbol operatora se mora pisati odvojeno od ključne reči operator. - Da li operatorske funkcije mogu imati podrazumevane vrednosti? - Ne mogu.
- Da li operatorski metodi mogu biti statički? - Ne mogu biti statčki (osim new i delete).
- Da li operatorski metodi mogu imati modifikatore? - Da (npr. const, volatile, & i &&).
- Da li je moguće napisati operatorsku funkciju gde nijedan parametar nije klasnog tipa? - Ne, bar jedan parametar mora biti klasnog tipa.
- Da li je moguće u programu imati isti operator i kao metod i kao globalnu funkciju? - Ne.
- Da li operatorski metod dozvoljava konverzije? - Operatorski metod ne dozvoljava konverziju levog operanda.
- Kako se piše operatorska funkcija ako prvi operand nije klasnog tipa? - Kao globalna (prijateljska) funkcija.
- Koji operatori moraju biti nestatički? - Operatori =, [], (), -> i (tip).
- Kada se brišu ugrađeni kopirajući i premeštajući operatori dodele? - Ugrađena kopirajuća dodela se suspenduje ako se u klasi definiše premeštajući konstruktor ili premeštaju ća dodela. Premeštajuća dodela se suspenduje ako se u klasi definiše kop./prem. konstruktor, destruktor ili kop. dodela
- Kako se razlikuje postfiksna i prefiksna varijanta prilikom pisanja inkrementirajućeg i dekrementirajućeg operatora? - Prefiksni: T& operator@@(), postfiksni: T operator@@(int).
- Šta su funkcijska klasa i funkcijski objekat? - Klasa sa preklopljenim operatorom () – funkcijska klasa, objekat funkcijske klase – funkcijski objekat.
- Kako se preklapa operator
->
? - Kao nestatička metoda bez parametara (unarni operator). - Kog tipa treba da bude povratna vrednost operatora
->
? - Rezultat treba da bude tipa pokazivača na objekat klase koja sadrži clan ili objekat (ili referenca) klase za koju je takođe definisan operator->. - Kog tipa može da bude povratna vrednost kast operatora? - Standardni, izvedeni (npr. pokazivač) ili klasni tip.
- Kako se piše kast operator, šta se mora izostaviti u deklaraciji i definiciji? - Tip povratne vrednosti funkcije ne sme da bude naveden u deklaraciji/definiciji i on se podrazumeva na osnovu imena funkcije.
- Na koja dva načina se može pozvati kast operator i koje ograničenje važi za jedan od načina? - (T)x ili T(x). Oblik notacije T(x) ne može da se koristi za tipove sa većim brojem reči (npr. unsigned long).
- Koja je uloga modifikatora
explicit
kod kast operatora? - Ako treba da se spreči implicitna konverzija. - Kako se preklapaju operatori
new
idelete
? - Kao statićki metodi. - Da li funkcije za operatore
new
idelete
treba da pozivaju konstruktore/destruktore? - Ne, jer se oni pozivaju implicitno. - Koju povratnu vrednost treba da ima operator
new
? - Operator new treba da vrati pokazivač na alocirani prostor. - Da li klasa može imati više preklopljenjih operatora
new
i kako se to postiže? - Može ako oni imaju različite parametre. - Koliko preklopljenjih operatora
delete
funkcija može da ima? - Samo po jednu (za podatak i niz) delete funkciju. - Kako se unutar preklopljenjih operatora
new
idelete
pozivaju ugrađeni operatorinew
idelete
? - Eksplicitno, preko unarnog operatora :: ili implicitno, kada se dinamički stvaraju/uništavaju objekti koji nisu tipa T. - Da li operatori
new
idelete
mogu biti virtuelni? - Ne. - Da li se operatori
new
idelete
nasleđuju? - Da. - Šta treba da vraćaju operatorske funkcije
<<
i>>
kada se realizuje unos/ispis? - Referencu na levi operand (ostream& i istream&). - Da li operatorske funkcije za unos/ispis mogu biti metode? - Ne.
- Koji operatori se mogu napisati za nabrajajuće tipove? - Dozvoljeno je preklapanje operatora koji se ne preklapaju kao metodi.
Izvođenje
- Šta je višestruko izvođenje, da li je to i izvođenje iz već izvedene klase? - Višestruko izvođenje podrazumeva da se klasa nasleđuje osobine više osnovnih klasa. Izvođenje iz iz već izvedene klase takođe spada pod višestruko.
- Šta označava modifikator final kod klasa, a šta kod metoda? -
final
kod klasa označava da se klasa ne može naslediti (iz nje se ne može izvesti više nijedna klasa). Final je takođe modifikator metode koji sprečava nadjačavanje (override
) metode u izvedenoj klasi. - Da li se može reč final pojaviti i kao identifikator? - Ne.
- Šta izvedena klasa ne nasleđuje iz osnovne? - Izvedena klasa iz osnovne klase ne nasleđuje sve atribute i metode označene sa
final
modifikatorom. - U kojim slučajevima se može pristupiti zaštićenim članovima iz metoda izvedene klase? - Zaštićenim članovima se jedino može pristupiti kao nasleđenim članovima, a ne kao atributima osnovne klase.
- Kako se može eksplicitno promeniti pravo pristupa nasleđenom članu, i da li se može promeniti pravo pristupa članu koji je u osnovnoj klasi privatan? - Eksplicitno može promeniti pomoću reči “using” (npr. using X::x1). Ne može se promeniti pravo pristupa privatnog člana osnovne klase, jer nasleđena nema pristup istim.
- Koja je razlika između javnog, privatnog i zaštićenog izvođenja, u kojim slučajevima objekat izvedene klase može da zameni objekat osnovne klase? - Javno izvođenje realizuje koncept nasleđivanja (+ objekat izvedene može da zameni objekat osnovne klase), a privatno koncept sadržanja (+ objekat izvedene klase NE može da zameni objekat osnovne klase). Zaštićeno unutar izvedene klase iz zaštićeno izvedene realizuje koncept nasleđivanja, a izvan koncept sadržanja.
- Šta se dešava ukoliko u izvedenoj klasi napiše metod koji ima isto ime kao metod iz osnovne klase? - Prema svojstvu polimorfizma se originalna metoda preklapa nadjača, odnosno za svaku izvedenu klasu se koristi nova definicija date metode. Koja metoda će se koristiti, stara ili nova, se određuje dinamički, za vreme izvršavanja programa.
- Na koji način se može pristupiti sakrivenom polju osnovne klase? - U metodima izvedene klase se sakrivenim poljima osnovne klase pristupa pomoću
ime_osnovne_klase::clan.
- Kako se prilikom zaštićenog i privatnog izvođenja restaurira vidljivost svih metoda nekog imena, a kako samo pojedinačnog? - Svi metodi nekog imena se restauriraju pomoću
using osnovna_klasa::ime_metoda
(neće biti vidljivi metodi osnovne sa istim potpisom kao metodi izvedene klase). Ne može da se restaurira vidljivost pojedinačnog metoda osnovne klase. - Da li se konstruktori nasleđuju prilikom izvođenja? - Konstruktori osnovne klase se ne nasleđuju.
- Šta se dešava kad se uvezu konstruktori? - Kada se svi konstruktori uvezu sa “using ime_klase::ime_klase” generišu se konstruktori izvedene klase sa istim potpisima, koji imaju prazno telo, ali se samo implicitno pozivaju konstruktore osnovne sa istim potpisom.
- Koje izvođenje je podrazumevano? - Privatno izvođenje je podrazumevano.
- Da li se može izvesti iz unije i da li unije mogu izvoditi? - Ne, ne.
- Da li konstruktor može inicijalizovati nasleđene atribute? - Može, koristeći konstruktor osnovne klase, ali eksplicitna inicijalizacija nasleđenih atributa nije dozvoljena.
- Da li je objekat izvedene klase uvek i objekat osnovne klase? - Jeste ukoliko je klasa javno izvedena iz osnovne. Nije objekat osnovne klase, ukoliko je izvedena klasa privatno ili zaštićeno izvedena iz osnovne.
- Da li se virtuelnost funkcije nasleđuje, tj. da li se u izvedenim klasama mora navesti da je funkcija virtuelna? - Ne mora.
- U kojim stvarima se potpis metode u izvedenoj klasi sme razlikovati od potpisa virtuelne metode u osnovnoj klasi, šta se dešava ako se razlikuje više? - Ako je rezultat virtuelne metode pokazivač/refernca na osnovnu klasu, redefinisani metod sme da vraća i pokazivač/referencu na klasu izvedenu iz date osnovne. Neslaganje potpisa istoimenog metoda rezultira u sakrivanju metoda. Ukoliko se potpis razlikuje samo po tipu rezultata, osim u navedenom slučaju, dešava se greška.
- Da li se svaki virtuelni metod mora definisati u svakoj izvedenoj klasi i šta se dešava ako neki nije napisan? - Ne mora se definisati u svakoj izvedenoj klasi, ako nije napisan važi nasleđeni virtualni metod iz osnovne klase.
- Kada se aktivira virtuelni mehanizam, tj. kako se objektu mora pristupiti? - Mora se pristupiti indirektno - preko reference ili pokazivača.
- Koja je svrha modifikatora override, da li je to rezervisana reč? - Eksplicitno se ukazuje da metod nadjačava odgovorajući virtuelni metod, nije rezervisana reč.
- Da li se i override i final mogu zajedno naći u potpisu metoda? - Mogu.
- Šta klasu čini polimorfnom? - Klasa je polimorfna ukoliko sadrži barem jednu virtuelnu metodu.
- Šta dodatno sadrži svaki objekat polimorfne klase? - Pokazivač na TVF (tabelu virtuelnih funkcija)
- Da li statičke metode i globalne prijateljske funkcije mogu biti polimorfne, ako ne mogu kako se onda postiže polimorfno ponašanje kod njih? - Ne mogu. Statičke metode moraju da pozivaju nestatički virtuelni metod za neki objekat date klase, pokazivač/referenca na objekat može da seprosledi kao parametar. Problem kod globalnih prijateljskih funkcija se rešava na isti način.
- Da li konstruktori i destruktori mogu biti virtuelni i zašto? - Konstrukor ne može biti virtualan jer se poziva pre no što se objekat kreira. Destruktor može biti virtualan, tada se tek u vreme izvršenja određuje koji se destrukor poziva.
- Da li izvedena klasa treba eksplicitno pozvati destruktor osnovne klase? - Ne, jer se implicitno poziva konstruktor osnovne klase.
- Da li je niz objekata izvedene klase jedna vrsta niza objekata osnovne klase, da li se mogu bezbedno konvertovati, da li postoji slučaj kad može doći do greške i da li prevodilac to može otkriti? - Ne, nije. Bezbedna konverzija, pokazivača/reference na objekat(e) izvedene klase u osnovnu, je moguća ukoliko je izvedena klasa javno izvedena iz osnovne. Ukoliko je privatno izvedena, pokazivač na objekat(e) takve klase može se implicitno konvertovati samo unutar izvedene klase, u suprotnom nastaje greška, koju bi prevodilac trebao da otkrije pre prevođenja.
- Da li je dozvoljena konverzija niza pokazivača na objekte izvedene klase u niz pokazivača na objekte osnovne klase? - Jeste, samo ukoliko je izvedena klasa javno izvedena iz osnovne.
- Kada je klasa virtuelna, a kada apstraktna? - Virtuelna je kada su njeni metodi definisani, ali se mogu redefinisati u izvedenim klasama. Apstraktna je barem jedna metoda klase samo deklarisana, te se mora definisati u izvedenoj klase.
- Da li je moguće imati primere apstraktne klase, a šta važi za pokazivače i reference takve klase? - Nije moguće instancirati apstraktnu klasu, ali mogu da postoje pokazivači/reference na istu.
- Kako je moguće sprečiti stvaranje objekata klase čije su svi metode konkretne i ne-apstraktne? - Deklaracijom apstraktnog konstruktora (
virtual ~Klasa() = 0)
- Da li klasa može da ima apstraktni destruktor bez definicije? - Ne, ne može. Apstraktni destruktor mora biti definisan van tela klase.
- Da li klasa izvedena iz apstraktne klase mora da definiše sve apstraktne metode i šta se dešava ukoliko ih ne definiše? - Izvedena klasa ne mora da definiše sve metode apstraktne klase, ali tada je i ona sama apstraktna.
- Da li apstraktna klasa može da ima konstruktor i kako on radi? - Može, on se poziva pri konstrukciji konkretnih objekata, izvedenih iz apstraktne klase.
- Kakva mora da bude klasa pokazivača/reference koja se šalje kao parametar operatoru dynamic_cast? - Klasa mora biti polimorfna, u suprotnom se dešava greška pri prevođenju.
- Šta se dešava ukoliko pokazivač/referenca prosleđeni operatoru dynamic_cast ipak ne upućuju na objekat izvedene klase (ili klase još izvedenije iz nje) u koju se vrši konverzija? - Baca se izuzetak bad_cast, koji je definisan u <typeinfo>.
- Da li operator typeid izračunava izraz? - Ne.
- Šta vraća operator typeid kad je upotrebljen nad objektom polimorfne klase (u obliku reference ili dereferenciranog pokazivača), a šta nad objektom ne-polimorfne klase? - Rezultat se odnosi na dinamički tip operanda, u sportnom se odnosi na statički. (slide 52 u “Izvođenje” za primer kako ovo radi).
- Šta se dešava ukoliko se u izrazu prosleđenom typeid operatoru dereferencira nullptr pokazivač? - Ukoliko pokazivač pokazuje na polimorfnu klasu, baca se izuzetak bad_typeid, inače se rezulat odnosi na statički tip pokazivača (X *p -> info za X).
- Koji koncept uvodi operator typeid? - Introspekciju/refleksiju, način da program saznaje o sebi.
- Koji tip objekta vraća operator typeid i da li je moguće sačuvati njegov rezultat u promenljivu i zašto? - Tip objekta je type_info, njegov rezultat se ne može sačuvati u promenljivu jer klasa type_info nema javne konstruktore.
- Šta je problem dijamant strukture i kako se rešava? - Kada su osnovne klase pri višestrukom izvođenju izvedene iz iste klase. Ovaj problem se rešava tako što se ta ista klasa deklariše kao virtuelna osnovna klasa. (slide 57 u “Izvođenje” za primer)
- Kojim redosledom se izvršava konstrukcija pri višestrukom nasleđivanju? - Prvo se izvršava konstrukcija svih osnovnih klasa, po redosledu deklaracije, potom konstrukcija atributa izvedene klase i na kraju konstruktor izvedene klase.
Izuzeci
- Kog tipa može biti bačeni izuzetak? - Izuzetak može biti objekat klase ili nekog drugog tipa.
- Da li operator
noexcept
izračunava izraz i na koji način onda gleda tačnost? - Izraz se ne izračunava, ali se u toku prevođenja proverava da li se može desiti izuzetak izračunavajući isti. Ukoliko izraz SIGURNO ne može izazvati izuzetak, tada noexcept operator vraća true, u suprotnom vraća false. - Kojim redosledom treba navoditi rukovaoce? - Rukovaoci tipa izvedenog iz neke osnovne klase treba da se stave ispred rukovaoca tipa te osnovne klase, univerzalni rukovalac treba da se stavi na poslednje mesto.
- Koji je životni vek bačenog objekta? - Životni vek bačenog objekta izuzetka je do kraja poslednjeg pozvanog rukovaoca.
- Šta se dešava ukoliko je bačen lokalni objekat? - Izuzetak će biti njegova kopija.
- Šta se dešava sa atributima klase ukoliko se desi izuzetak u konstruktoru koji propagira van konstruktora? - Oni se uništavaju, uključujući i nasleđene podobjekte.
- Koja je svrha funkcijske naredbe
try
? - Koristi se u deklaraciji funkcije kako bi se omogućilo postavljanje rukovodilačkih (catch
) blokova zajedno sa samom deklaracijom iste. Ovo se obično koristi kada želimo da uhvatimo izuzetak koji se može javiti prilikom inicijalizacije objekta unutar tela funkcije. - Da li se u rukovaocima funkcijske naredbe
try
mogu koristiti parametri funkcije? - Da, mogu. - Šta moraju da urade rukovaoci funkcijske naredbe
try
na kraju svog izvršavanja? - Ukoliko se ne baca izuzetak ili funkcija nijevoid
, mora da se izvršireturn
koji vraća rezultat istog tipa kao i sama funkcija. - Da li se treba pristupati atributima i nasleđenom podobjektu unutar rukovaoca funkcijskog
try
bloka konstruktora? - Ne treba jer su posledice nepredvidive (neki još nisu inicijalizovani, a objekti one klase koji su već bili konstruisani, odgovarajući destruktor je uništio pre izvršenja rukovodioca). - Šta se dešava na kraju rukovaoca funkcijskog
try
bloka konstruktora? - Izaziva novo bacanje izuzetaka (kao da je rukovodilac završen naredbomthrow;
) - Čemu je ekvivalentan modifikator
noexcept
? - noexcept <=> noexcept(true) <=> throw() - Da li konstruktor sa funkcijskim
try
blokom sme imatinoexcept
? - Ne sme. - Šta se dešava ukoliko se za neki izuzetak ne pronađe rukovalac? - Izvršava se sistemska funkcija
noreturn void terminate() noexcept
. - Šta podrazumevano radi funkcija
terminate()
i da li je to moguće promeniti, i ukoliko je moguće šta ta alternativna funkcija mora na kraju da uradi? - Podrazumevano poziva funkcijuabort()
, koja daje kontrolu operativnom sistemu. To je moguće promeniti pomoću funkcijeset_terminate()
kojoj, kao argument, treba da se dostavi pokazivač na funkciju kojuterminate()
treba da pozove umestoabort()
. Ta nova funkcija mora da pozoveexit(int)
iliabort()
za povratak u operativni sistem. Pokušaj povratka sa return iz te nove funkcije će dovesti do nasilnog pozivanjaabort()
. - Da li ijedna metoda klase izvedene iz
std::exception
sme da baci izuzetak i zašto? - Ne sme, što se obezbeđuje sa 'noexcept', jer se lista izuzetaka ne sme proširiti.
Šabloni
- Da li je mehanizam generika statički ili dinamički? - Mehanizam šablona je statički (proverava se u vreme prevođenja).
- Da li ima smisla odvojeno prevođenje šablona, tj. pisanje istih u
.cpp
datotekama i koja je mana toga? - Odvojeno prevođenje šablona nema smisla, mana toga je što korisnik vidi celu implementaciju u .h fajlu, a ne samo ugovor. - Šta mogu biti formalni parametri šablona? - Formalni parametri šablona (između <>) mogu piti tipovi i konstante.
- Kako se na zahtev generišu konkretne funkcije i klase iz šablona? - Funkcije se generišu navođenjem deklaracije funkcije sa argumentima šalona, dok se klase generišu na isti način, navođenjem argumenata šablona u deklaraciji klase.
- Da li se implicitno mogu generisati konkretne funkcije i klase iz šablona i pod kojim uslovima? - Da mogu, ovo se odnosi na proces koji se naziva "implicitna instantijacija šablona". Kompajler može automatski generisati konkretne implementacije šablona kada mu bude potrebna, na osnovu upotrebe šablona u kodu.
- Kada je neophodno eksplicitno navesti stvarne argumente šablona funkcije? - Pri generisanju na zahtev.
- Kada će biti sprečeno automatsko generisanje funkcije iz šablona, a kako se može forsirati generisanje funkcije iz šablona? - Biće sprečeno ako se prethodno pojavljuje odgovarajuće definicija obične funkcije. Forsiranje generisanja funkcije iz šablona se postiže eksplicitnim navođenjem stvarnih argumenata šablona.
- Da li se pri generisanju klase iz šablona generišu i sve njene virtuelne metode? - Da.
- Da li se može imenovati klasa pri generisanju iz šablona? - Može, koristeći typedef ili using.
typedef Vekt<char*, 100> VektorStr; using VektorRelanih = Vekt<float, 1000>
- Da li argumenti šablona mogu da imaju podrazumevane vrednosti i šta se dešava pri implicitnom zaključivanju kod šablonskih funkcija? - Mogu, pri implicitnom zaključivanju se podrazumevana vrednost može odrediti na osnovu stvarnih argumenata funkcije.
- Da li se podrazumevane vrednosti argumenata moraju navesti i prilikom definicije svakog metoda šablonske klase ili je dovoljno samo jednom prilikom definicije/deklaracije klase? - Dovoljno je navesti ih samo jednom pri definiciji/deklaraciji klase. (slide 14 u “Generici)”
- Ako je formalni parametar šablona konstanta, kog tipa mora da bude? - Konstantni celobrojni izraz.
- Iz kog razloga su samo konstantne dozvoljene kao parametri šablona, a ne i promenljive? - Unapređenje performanse izvršavanja (parametri se evaluiraju tokom prevođenja), unapređenje sigurnosti (statička analiza tokom prevođenja).
- Da li raniji formalni parametri se mogu koristiti za podrazumevane/početne vrednosti kasnijih parametara šablona? - Ne mogu, jer formalni parametri ne mogu zavisiti jedni od drugih, u smislu da se vrednost jednog parametra koristi za određivanje podrazumevane vrednosti drugog parametra.
- Da li funkcije mogu biti parametri šablona i ako ne šta se u tom slučaju radi? - Funkcije ne mogu biti parametri šablona, rešenje je funkcijska klasa (klasa za koju je definisan operator())
- Kakvi su konstruktori inicijalizatorske liste? - Privatni, poziva ih samo prevodilac za stvaranje inicijalizatorske liste na osnovnu navedenih podataka.
- Koje javne metode imaju inicijalizatorske liste? -
size()
(vraća broj elemenata liste) ,begin()
(vraća pokazivač na prvi nepromenljivi element liste),end()
(vraća pokazivač iza poslednjeg elementa liste). - Kako pišemo konstruktor klase ako želimo da objekat inicijalizujemo inicijalizatorskom listom proizvoljne dužine? - Potrebno je da klasa ima konstruktor sa parametrom inicijalizatorkse liste. Ostali parametri tog konstruktora moraju imati podrazumevane vrednosti.
- Da li se argumenti konstruktora mogu navesti pomoću incijalizatorske liste i koja razlika postoji između tog načina i poziva konstruktora čiji je parametar inicijalizatorska lista? - Mogu. Razlika je u tome što se na ovaj način članovi mogu navesti u vitičastim zagradama i mogu biti različitih tipova.
- U kom slučaju se neće pozvati konstruktor koji prima inicijalizatorsku listu, a objekat se inicijalizuje inicijalizatorskom listom? - U slučaju praznog niza u {} zagradama.
- Da li parametri šablona prilikom specijalizacije mogu imati podrazumevane vrednosti? - Ne mogu.
- Koja ograničenja važe za specijalizaciju šablona funkcije? - Moguća je samo potpuna specijalizacija (specijalizovan šablon nema nijedan parametar , tada na osnovu specijalizacije može da se generiše samo jedna funkcija).
- Kada je specijalizacija moguća, a kada prestaje biti moguća? - Moguća je ako je prethodno navedena barem deklaracija opšte generičke klase.
- Šta se dešava ukoliko imamo više podjednako specijalizovanih šablona, kako se odlučuje koji šablon je najspecijalizovaniji? - Bira se onaj sa najmanje parametara, potom opšti (ako nijedan odgovara), u suprotnom javlja se greška ako biše njih odgovara.
- Da li metode klase mogu biti generičke, da li takve metode mogu biti virtuelne i da li mogu biti definisane i van klase? - Samo nevirtuelne metode mogu biti generičke i definisati se u klasi ili izvan nje, bilo ta klasa generička ili ne.
- Da li konstruktori i destruktori mogu da budu generički (bez obzira na to da li je klasa generička)? - Konstruktori mogu biti generički, bila njihova klasa generička ili ne. Destruktori ne mogu biti generički kakva god da je klasa.
- Kako se pozivaju generički metodi, a kako generički konstruktori? - Mogu se pozvati kao i obične metode/konstruktori, ukoliko na osnovu arguments istih mogu da se odrede argumenti šablona. Iza imena metoda se mogu navesti argumenti šablona između <>. Ispred imena metoda se može napisati “template” (slide 27 u “Generici” za primer).
- Da li ugnježdene klase mogu da budu generičke i kakva mora da bude spoljašnja klasa? - Može, njena spoljna klasa može, a i ne mora biti generička. U slučaju generičke spoljne, odnosno unutrašnje, oznaka obe klase mora da sadrži i parametre šablona.