ОО1/Пробни тестови 2020 — разлика између измена
м (→9. zadatak: Nabavio sam screenshot tačnog rešenja (ne znam koji su još operatori bili ponuđeni)) |
м (→5. zadatak: slovna greska :)) |
||
(Није приказано 12 међуизмена 4 корисника) | |||
Ред 1: | Ред 1: | ||
{{tocright}} | {{tocright}} | ||
{{rešenja}} | |||
== Prvi test == | == Prvi test == | ||
Ред 9: | Ред 7: | ||
=== 1. zadatak === | === 1. zadatak === | ||
Prilikom reupotrebe objektno orijentisanog koda izvođenjem, u načelu se stari kod (postojeća klasa - osnova za izvođenje): | Prilikom reupotrebe objektno orijentisanog koda izvođenjem, u načelu se stari kod (postojeća klasa - osnova za izvođenje): | ||
<div class="abc-list"> | <div class="abc-list" data-solution="single"> | ||
# <span class="solution">ne mora menjati ni ponovo prevoditi i testirati.</span> | # <span class="solution">ne mora menjati ni ponovo prevoditi i testirati.</span> | ||
# ne mora menjati, ali se mora ponovo prevoditi i testirati. | # ne mora menjati, ali se mora ponovo prevoditi i testirati. | ||
Ред 19: | Ред 17: | ||
=== 2. zadatak === | === 2. zadatak === | ||
Koja naredba omogućava korišćenje imena X iz prostora imena Y prostim imenovanjem X, ukoliko ne postoji konflikt imena? | Koja naredba omogućava korišćenje imena X iz prostora imena Y prostim imenovanjem X, ukoliko ne postoji konflikt imena? | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# <code>decltype Y;</code> | # <code>decltype Y;</code> | ||
# <span class="solution"><code>using namespace Y;</code></span> | # <span class="solution"><code>using namespace Y;</code></span> | ||
Ред 46: | Ред 44: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Odgovor: <span class="spoiler">4</span> | Odgovor: <span class="spoiler" data-solution="text">4</span> | ||
Objašnjenje: <span class="spoiler" data-solution="explanation">1 i 2 odgovaraju poljima a i b strukture S1. <code>{{3},{},{4,5}}</code> predstavlja inicijalizaciju niza, prošireno predstavljenu kao <code>{{3, 0}, {0, 0}, {4, 5}}</code>. Na kraju se iz trećeg niza iz polja b (<code>{4, 5}</code>) ispisuje prvi element.</span> | |||
=== 4. zadatak === | === 4. zadatak === | ||
Ред 65: | Ред 65: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# < | # <code class="solution">a2.z=1;</code> | ||
# <code>a1.y=1;</code> | # <code>a1.y=1;</code> | ||
# <code>a2.y=1;</code> | # <code>a2.y=1;</code> | ||
# < | # <code class="solution">a1.x=1;</code> | ||
# < | # <code class="solution">a1.z=1;</code> | ||
# <code>a2.x=1;</code> | # <code>a2.x=1;</code> | ||
</div> | </div> | ||
Ред 76: | Ред 76: | ||
=== 5. zadatak === | === 5. zadatak === | ||
Koje funkcije su ispravne, jer vraćaju referencu na "živ" objekat? | Koje funkcije su ispravne, jer vraćaju referencu na "živ" objekat? | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# <code>int& f(int &i){int r=i; return r; }</code> | # <code>int& f(int &i){int r=i; return r; }</code> | ||
# <code>int& f(int i){return i; }</code> | # <code>int& f(int i){return i; }</code> | ||
# < | # <code class="solution">int& f(int &i){return *new int(i); }</code> | ||
# < | # <code class="solution">int& f(int &i){int &r=*new int(i); return r; }</code> | ||
# < | # <code class="solution">int& f(int &i){return i; }</code> | ||
# <code>int& f(int &i){int r=*new int(i); return r; }</code> | # <code>int& f(int &i){int r=*new int(i); return r; }</code> | ||
</div> | </div> | ||
Objašnjenje: <span class="spoiler" data-solution="explanation">Prva funkcija vraća referencu na lokalnu promenljivu u koju je kopirana vrednost. Druga funkcija isto, ali se kopiranje dešava pri prosleđivanju argumenata. Šesta funkcija alocira objekat na hipu, ali onda njegovu vrednost kopira u lokalnu promenljivu pa vraća referencu na tu promenljivu.</span> | |||
=== 6. zadatak === | === 6. zadatak === | ||
Koji od sledećih iskaza su tačni na jeziku C++? | Koji od sledećih iskaza su tačni na jeziku C++? | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# <span class="solution">Klasa može imati više privatnih sekcija.</span> | # <span class="solution">Klasa može imati više privatnih sekcija.</span> | ||
# Iz metoda pozvanog za neki objekat se ne može pristupiti privatnom atributu drugog objekta iste klase. | # Iz metoda pozvanog za neki objekat se ne može pristupiti privatnom atributu drugog objekta iste klase. | ||
Ред 97: | Ред 98: | ||
=== 7. zadatak === | === 7. zadatak === | ||
Za nepromenljiv i nepostojan (<code>const volatile</code>) objekat klase mogu da se pozivaju metodi te klase sa navedenim sledećim modifikatorima (koji određuju prirodu tekućeg objekta): | Za nepromenljiv i nepostojan (<code>const volatile</code>) objekat klase mogu da se pozivaju metodi te klase sa navedenim sledećim modifikatorima (koji određuju prirodu tekućeg objekta): | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# <code>inline</code> | # <code>inline</code> | ||
# <code>const</code> | # <code>const</code> | ||
# <code>volatile</code> | # <code>volatile</code> | ||
# < | # <code class="solution">const volatile</code> | ||
# bez modifikatora | # bez modifikatora | ||
</div> | </div> | ||
Ред 113: | Ред 114: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Za koje od sledećih linija koda u funkciji main() će prevodilac prijaviti grešku? | Za koje od sledećih linija koda u funkciji main() će prevodilac prijaviti grešku? | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# < | # <code class="solution">Test test;</code> | ||
# < | # <code class="solution">Test* test = new Test();</code> | ||
# <code>Test test();</code> | # <code>Test test();</code> | ||
# <code>Test* test;</code> | # <code>Test* test;</code> | ||
# < | # <code class="solution">Test test{};</code> | ||
</div> | </div> | ||
Objašnjenje: <span class="spoiler" data-solution="explanation">Podrazumevani konstruktor se nalazi u privatnoj sekciji. Opcija pod c je deklaracija metode a opcija pod d ne pravi objekat uopšte.</span> | |||
=== 9. zadatak === | === 9. zadatak === | ||
Ред 153: | Ред 155: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Odgovor: <span class="spoiler">ABA1C1</span> | Odgovor: <span class="spoiler" data-solution="text">ABA1C1</span> | ||
Objašnjenje: <span class="spoiler" data-solution="explanation">Inicijalizuje se klasa C konstruktorom sa jednim argumentom. Odatle kreće inicijalizacija njenog atributa tipa B, kada se poziva podrazumevani konstruktor. B sadrži objekat klase A, pa se podrazumevanim konstruktorom inicijalizuje A i ispisuje A. Tada je gotova inicijalizacija atributa klase B i inicijalizacija B se završava ispisivanjem B. Zatim se prelazi na inicijalizaciju atributa tipa A klase C, ali konstruktorom sa jednim argumentom jer tako piše u inicijalizacionoj listi, pa se ispisuje A1. Na kraju se ispisuje C1.</span> | |||
=== 10. zadatak === | === 10. zadatak === | ||
Ред 164: | Ред 168: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# <span class="solution">Klasa A ima konverzioni konstruktor.</span> | # <span class="solution">Klasa A ima konverzioni konstruktor.</span> | ||
# Klasa A ima jedan konstruktor. | # Klasa A ima jedan konstruktor. | ||
Ред 170: | Ред 174: | ||
# <span class="solution">Objekat klase A se može stvoriti pozivanjem konstruktora koji ima jedan argument.</span> | # <span class="solution">Objekat klase A se može stvoriti pozivanjem konstruktora koji ima jedan argument.</span> | ||
# Klasa A nema podrazumevani konstruktor. | # Klasa A nema podrazumevani konstruktor. | ||
</div> | |||
== Drugi test == | |||
=== 1. zadatak === | |||
: ''Isti zadatak se našao i na [[#8. zadatak 3|probnom kolokvijumu za IR]].'' | |||
Koji od sledećih operatora se moraju preklopiti kao nestatički metodi u jeziku C++? | |||
<div class="abc-list" data-solution="multiple"> | |||
# <span class="solution"><code>operator()</code></span> | |||
# <span class="solution"><code>operator[]</code></span> | |||
# <code>operator<<</code> | |||
# <span class="solution"><code>operator=</code></span> | |||
# <code>operator+</code> | |||
</div> | |||
=== 2. zadatak === | |||
: ''Isti zadatak se našao i na [[#9. zadatak 3|probnom kolokvijumu za IR]].'' | |||
Povezati operatore sa odgovarajućom tipičnom primenom: | |||
<div data-solution="select" data-options="operator[], operator(), operator->"> | |||
# Računanje vrednosti polinoma u tački <span class="spoiler">operator()</span> | |||
# Pametni pokazivač <span class="spoiler">operator-></span> | |||
# Asocijativni pristup elementu zbirke <span class="spoiler">operator[]</span> | |||
</div> | |||
=== 3. zadatak === | |||
: ''Isti zadatak se našao i na [[#10. zadatak 3|probnom kolokvijumu za IR]].'' | |||
Šta ispisuje sledeći program na programskom jeziku C++? Ukoliko se program ne prevodi u polje za odgovor treba upisati vrednost 0. | |||
<syntaxhighlight lang="cpp"> | |||
#include <iostream> | |||
class B; | |||
class A { | |||
public: | |||
A(int i) {} | |||
A(const B &b) { std::cout << "1"; } | |||
A& operator=(const A& a) { std::cout << "2"; return *this; } | |||
}; | |||
class B { | |||
public: | |||
operator A() { std::cout << "3"; return 1; } | |||
}; | |||
int main() { | |||
B b; | |||
A a(1); | |||
a = b; | |||
} | |||
</syntaxhighlight> | |||
Odgovor: <span class="spoiler" data-solution="text">32</span> | |||
Objašnjenje: <span class="spoiler" data-solution="explanation">Operator = klase A prima argument tipa A, pa mora da se desi konverzija iz B u A. Ovde izgleda kao da je konverzija dvoznačna, jer može da se izvrši i preko konverzionong konstruktora klase A, i preko operatora konverzije klase B, ali nije. Naime, konverzioni konstruktor klase A prima argument koji ima <code>const</code> kvalifikator, dok operator konverzije nema <code>const</code> specifikator, pa konverzija ide preko operatora konverzije i ispisuje se 3. Nakon toga se izvrši operator dodele i ispiše 2.</span> | |||
=== 4. zadatak === | |||
Koje tvrdnje su tačne? | |||
<div class="abc-list" data-solution="multiple"> | |||
# Operator <code>delete</code> može imati proizvoljan broj argumenata. | |||
# U preklopljenom operatoru <code>new</code> treba, kao poslednju naredbu, napisati eksplicitan poziv konstruktora klase za koju se operator preklapa. | |||
# Klasa može imati više preklopljenih <code>delete</code> operatora za pojedinačne objekte. | |||
# <span class="solution">Operatori <code>new</code> i <code>delete</code> se preklapaju kao statički metodi klase.</span> | |||
# <span class="solution">Klasa može imati više preklopljenih operatora <code>new</code> za nizove.</span> | |||
</div> | |||
=== 5. zadatak === | |||
Koja od sledećih tvrdnji u vezi izvođenja klasa su tačna u jeziku C++? | |||
<div class="abc-list" data-solution="multiple"> | |||
# <span class="solution">Iz klase označene modifikatorom <code>final</code> nije moguće dalje izvođenje.</span> | |||
# Dozvoljeno je sledeće izvođenje: <syntaxhighlight lang="cpp"> | |||
class A : B { }; | |||
class B : A { }; | |||
</syntaxhighlight> | |||
# Podrazumevan način izvođenja je zaštićen (<code>protected</code>). | |||
# <span class="solution">Izvedena klasa ne nasleđuje konstruktore, destruktor i operatore <code>operator=</code> iz osnovne klase.</span> | |||
# <span class="solution">Izvođenje može biti javno (<code>public</code>), zaštićeno (<code>protected</code>) ili privatno (<code>private</code>).</span> | |||
</div> | |||
=== 6. zadatak === | |||
Koji iskazi su tačni? Izaberite jedan odgovor: | |||
<div class="abc-list" data-solution="single"> | |||
# <span class="solution">Privatnim izvođenjem uspostavlja se relacija sadržanja između objekta izvedene klase i nasleđenog podobjekta osnovne klase.</span> | |||
# Objekat zaštićeno izvedene klase je jedna vrsta objekta osnovne klase u svakoj globalnoj funkciji. | |||
# Objekat javno izvedene klase nasleđuje samo implementaciju osnovne klase, ne i ugovor. | |||
# Kod privatnog izvođenja nasleđuje se ugovor osnovne klase. | |||
# Javnim izvođenjem se samo uspostavlja relacija sadržanja između objekta izvedene klase i nasleđenog podobjekta osnovne klase. | |||
</div> | |||
=== 7. zadatak === | |||
Šta ispisuje sledeći program na jeziku C++? | |||
<syntaxhighlight lang="cpp"> | |||
#include <iostream> | |||
using namespace std; | |||
class A { | |||
public: | |||
A() { cout << "A"; } | |||
}; | |||
class C { | |||
public: | |||
C() { cout << "C"; } | |||
}; | |||
class B: public A { | |||
C c; A a; | |||
public: | |||
B():c(), A(), a() { cout << "B"; } | |||
}; | |||
int main() { | |||
B b[2]; | |||
} | |||
</syntaxhighlight> | |||
<div class="abc-list" data-solution="single"> | |||
# CAABCAAB | |||
# ACBACB | |||
# AACBAACB | |||
# <span class="solution">ACABACAB</span> | |||
</div> | |||
Objašnjenje: <span class="spoiler" data-solution="explanation">Prvo se inicijalizuje podobjekat A, a zatim atributi tipa C a zatim A, i na kraju se poziva konstruktor B. Redosled u inicijalizatorskoj listi nije bitan. Pošto se prave dva objekta u nizu, ispisuje se dva puta.</span> | |||
=== 8. zadatak === | |||
Šta ispisuje sledeći programski kod: | |||
<syntaxhighlight lang="cpp"> | |||
#include <iostream> | |||
using namespace std; | |||
class O { | |||
public: | |||
virtual void m() { cout << "1"; } | |||
}; | |||
class I : public O { | |||
public: | |||
virtual void m() override { cout << "2"; } | |||
}; | |||
int main() { | |||
O * p = new I(); | |||
O o = *p; | |||
p->m(); | |||
(*p).m(); | |||
o.m(); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
Odgovor: <span class="spoiler" data-solution="text">221</span> | |||
Objašnjenje: <span class="spoiler" data-solution="explanation">Poziv metode preko objekta je nepolimorfan (treći slučaj), dok je poziv preko reference ili pokazivača polimorfan (prvi i drugi slučaj). Dereferenciranje vraća referencu, u ovom slučaju ne mora da se desi kopija objekta.</span> | |||
=== 9. zadatak === | |||
Šta treba da stoji umesto *** da bi dati program na jeziku C++ ispisao BA? Izaberite jedan ili više odgovora. | |||
<syntaxhighlight lang="cpp"> | |||
#include <iostream> | |||
using namespace std; | |||
class A { | |||
public: | |||
*** | |||
}; | |||
class B: public A { | |||
public: | |||
~B() { cout << "B"; } | |||
}; | |||
int main() { | |||
A *a = new B(); | |||
delete a; | |||
} | |||
</syntaxhighlight> | |||
<div class="abc-list" data-solution="multiple"> | |||
# ~A() { cout << "A"; } | |||
# <span class="solution">~A() { cout << "BA"; }</span> | |||
# virtual ~A() { cout << "BA"; } | |||
# <span class="solution">virtual ~A() { cout << "A"; }</span> | |||
</div> | |||
Objašnjenje: <span class="spoiler" data-solution="explanation">Ukoliko je destruktor virtuelan, pozvaće se destruktor i osnovne klase. Validna alternativa jeste da nevirtuelni destruktor samo ispiše traženi tekst.</span> | |||
=== 10. zadatak === | |||
Koje tvrdnje su tačne? | |||
<div class="abc-list" data-solution="multiple"> | |||
# <span class="solution">Višestrukim izvođenjem se smatra izvođenje iz više klasa koje nisu u uzajamnom odnosu izvođenja (nasleđivanja).</span> | |||
# Višestrukim izvođenjem se smatra izvođenje u kojem je jedna klasa roditelj većeg broja klasa. | |||
# Višestrukim izvođenjem se smatra izvođenje iz već izvedene klase. | |||
# Višestrukim izvođenjem se smatra izvođenje iz klase iz koje su već izvedene neke druge klase. | |||
# <span class="solution">Višestrukim izvođenjem se nasleđuju ugovori i implementacije svih roditeljskih klasa.</span> | |||
</div> | </div> | ||
Ред 175: | Ред 365: | ||
=== 1. zadatak === | === 1. zadatak === | ||
Prostor na steku se dodeljuje: | Prostor na steku se dodeljuje: | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# Lokalnim statičkim objektima | # Lokalnim statičkim objektima | ||
# Globalnim statičkim objektima | # Globalnim statičkim objektima | ||
Ред 198: | Ред 388: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<div class="abc-list"> | <div class="abc-list" data-solution="single"> | ||
# 133 | # 133 | ||
# 233 | # 233 | ||
Ред 205: | Ред 395: | ||
# 232 | # 232 | ||
</div> | </div> | ||
Objašnjenje: <span class="spoiler" data-solution="explanation"><code>auto</code>, za razliku od <code>decltype</code> ne zadržava da li je tip bio referenca ili pokazivač, pa je tip <code>y</code> samo <code>int</code> i promena nad <code>y</code> se ne oslikava nad <code>z</code>.</span> | |||
=== 3. zadatak === | === 3. zadatak === | ||
Koje tvrđenje je tačno? | Koje tvrđenje je tačno? | ||
<div class="abc-list"> | <div class="abc-list" data-solution="single"> | ||
# <span class="solution">Mehanizam preklapanje<sup>[sic]</sup> imena funkcija je potpuno statički, koja funkcija će se pozvati određuje se u vreme prevođenja.</span> | # <span class="solution">Mehanizam preklapanje<sup>[sic]</sup> imena funkcija je potpuno statički, koja funkcija će se pozvati određuje se u vreme prevođenja.</span> | ||
# Mehanizam preklapanje<sup>[sic]</sup> imena funkcija je potpuno dinamički, koja funkcija će se pozvati određuje se u vreme izvršavanja. | # Mehanizam preklapanje<sup>[sic]</sup> imena funkcija je potpuno dinamički, koja funkcija će se pozvati određuje se u vreme izvršavanja. | ||
Ред 217: | Ред 408: | ||
=== 4. zadatak === | === 4. zadatak === | ||
Koja tvrđenja su tačna na programskom jeziku C++? | Koja tvrđenja su tačna na programskom jeziku C++? | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# <span class="solution">Metodi <code>int f() & { return 1; }</code> i <code>int f() && { return 3; }</code> mogu postojati u istoj klasi.</span> | # <span class="solution">Metodi <code>int f() & { return 1; }</code> i <code>int f() && { return 3; }</code> mogu postojati u istoj klasi.</span> | ||
# <span class="solution">Metodi <code>int f() & { return 1; }</code> i <code>int f() const & { return 3; }</code> mogu postojati u istoj klasi.</span> | # <span class="solution">Metodi <code>int f() & { return 1; }</code> i <code>int f() const & { return 3; }</code> mogu postojati u istoj klasi.</span> | ||
Ред 224: | Ред 415: | ||
=== 5. zadatak === | === 5. zadatak === | ||
Šta ispisuje sledeći program napisan na programskom jeziku C++? Ukoliko | Šta ispisuje sledeći program napisan na programskom jeziku C++? Ukoliko se program ne prevodi unesite X. | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
#include <iostream> | #include <iostream> | ||
Ред 248: | Ред 439: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Odgovor: <span class="spoiler">268</span> | Odgovor: <span class="spoiler" data-solution="text">268</span> | ||
Objašnjenje: <span class="spoiler" data-solution="explanation">Pri inicijalizaciji objekta klase A polja b, c i a se prvo inicijalizuju na 7 (iz konstruktora), 8 (7+1) i 1, a zatim se u konstruktoru b smanji na 6 a a postavi na 2.</span> | |||
=== 6. zadatak === | === 6. zadatak === | ||
Ред 281: | Ред 474: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Odgovor: <span class="spoiler">41</span> | Odgovor: <span class="spoiler" data-solution="text">41</span> | ||
Objašnjenje: <span class="spoiler" data-solution="explanation">Stvara se objekat x, sa ID od 1. U prvoj iteraciji petlje se samo stvara objekat y sa ID od 2. U drugoj iteraciji petlje se ponovo stvara objekat y sa ID od 3, ali se prosleđuje metodi u kojoj se kopira i dobija ID od 4. Na kraju te metode se uništava i ispisuje 4. U trećoj iteraciji petlje se ponovo stvara objekat y sa ID od 5, pa se prosleđuje metodi u kojoj se ne kopira. Na kraju programa se uništava objekat x i ispisuje 1. Dinamički alocirani objekti nisu eksplicitno oslobođeni, pa njihovi destruktori nisu pozvani i memoriju koju oni zauzimaju će osloboditi operativni sistem.</span> | |||
=== 7. zadatak === | === 7. zadatak === | ||
Koja su tvrđenja tačna za prijateljske (<code>friend</code>) funkcije i klase? | Koja su tvrđenja tačna za prijateljske (<code>friend</code>) funkcije i klase? | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# Ako je klasa <code>A</code> prijatelj klase <code>B</code> i klasa <code>B</code> prijatelj klase <code>C</code>, onda je i klasa <code>A</code> prijatelj klase <code>C</code>. | # Ako je klasa <code>A</code> prijatelj klase <code>B</code> i klasa <code>B</code> prijatelj klase <code>C</code>, onda je i klasa <code>A</code> prijatelj klase <code>C</code>. | ||
# <span class="solution">Funkcija <code>m()</code> koja je prijatelj klasi <code>A</code> može biti globalna funkcija.</span> | # <span class="solution">Funkcija <code>m()</code> koja je prijatelj klasi <code>A</code> može biti globalna funkcija.</span> | ||
Ред 295: | Ред 490: | ||
=== 8. zadatak === | === 8. zadatak === | ||
Koji od sledećih operatora se moraju preklopiti kao nestatički metodi u jeziku C++? | Koji od sledećih operatora se moraju preklopiti kao nestatički metodi u jeziku C++? | ||
<div class="abc-list"> | <div class="abc-list" data-solution="multiple"> | ||
# < | # <code class="solution">operator[]</code> | ||
# < | # <code class="solution">operator=</code> | ||
# < | # <code class="solution">operator()</code></span> | ||
# <code>operator+</code> | # <code>operator+</code> | ||
# <code>operator<<</code> | # <code>operator<<</code> | ||
Ред 305: | Ред 500: | ||
=== 9. zadatak === | === 9. zadatak === | ||
Povezati operatore sa odgovarajućom tipičnom primenom: | Povezati operatore sa odgovarajućom tipičnom primenom: | ||
<div data-solution="select" data-options="operator[], operator(), operator->"> | |||
# Računanje vrednosti polinoma u tački <span class="spoiler">operator()</span> | |||
# Pametni pokazivač <span class="spoiler">operator-></span> | |||
# Asocijativni pristup elementu zbirke <span class="spoiler">operator[]</span> | |||
</div> | |||
=== 10. zadatak === | |||
Šta ispisuje sledeći program na programskom jeziku C++? Ukoliko se program ne prevodi u polje za odgovor treba upisati vrednost 0. | |||
<syntaxhighlight lang="cpp"> | |||
#include <iostream> | |||
class B; | |||
class A { | |||
public: | |||
A(int i) {} | |||
A(const B &b) { std::cout << "1"; } | |||
A& operator=(const A& a) { std::cout << "2"; return *this; } | |||
}; | |||
class B { | |||
public: | |||
operator A() { std::cout << "3"; return 1; } | |||
}; | |||
int main() { | |||
B b; | |||
A a(1); | |||
a = b; | |||
} | |||
</syntaxhighlight> | |||
Odgovor: <span class="spoiler" data-solution="text">32</span> | |||
=== | Objašnjenje: <span class="spoiler" data-solution="explanation">Operator = klase A prima argument tipa A, pa mora da se desi konverzija iz B u A. Ovde izgleda kao da je konverzija dvoznačna, jer može da se izvrši i preko konverzionong konstruktora klase A, i preko operatora konverzije klase B, ali nije. Naime, konverzioni konstruktor klase A prima argument koji ima <code>const</code> kvalifikator, dok operator konverzije nema <code>const</code> specifikator, pa konverzija ide preko operatora konverzije i ispisuje se 3. Nakon toga se izvrši operator dodele i ispiše 2.</span> | ||
[[Категорија:Рокови]] | [[Категорија:Рокови]] | ||
[[Категорија:ОО1]] | [[Категорија:ОО1]] |
Тренутна верзија на датум 8. јануар 2024. у 21:34
- За питања са више одговора, тачни одговори су подебљани и уоквирени
- За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
- Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:
Prvi test
Na svakom pitanju je bilo ili moguće izabrati jedno ili više rešenja ili uneti odgovor u polje.
1. zadatak
Prilikom reupotrebe objektno orijentisanog koda izvođenjem, u načelu se stari kod (postojeća klasa - osnova za izvođenje):
- ne mora menjati ni ponovo prevoditi i testirati.
- ne mora menjati, ali se mora ponovo prevoditi i testirati.
- ne mora menjati, mora ponovo prevoditi, ali se ne mora ponovo testirati.
- mora menjati i ponovo prevoditi i testirati.
- uopšte ne može iskoristiti.
2. zadatak
Koja naredba omogućava korišćenje imena X iz prostora imena Y prostim imenovanjem X, ukoliko ne postoji konflikt imena?
decltype Y;
using namespace Y;
using Y::X;
namespace Y.X;
using Y;
3. zadatak
Šta ispisuje sledeći program na jeziku C++?
#include <iostream>
struct S1{
int a;
int b;
};
struct S2{
S1 a;
int b[3][2];
};
int main() {
S2 s={1,2,{{3},{},{4,5}}};
std::cout<<s.b[2][0];
}
Odgovor: 4
Objašnjenje: 1 i 2 odgovaraju poljima a i b strukture S1. {{3},{},{4,5}}
predstavlja inicijalizaciju niza, prošireno predstavljenu kao {{3, 0}, {0, 0}, {4, 5}}
. Na kraju se iz trećeg niza iz polja b ({4, 5}
) ispisuje prvi element.
4. zadatak
Šta je dozvoljeno da stoji na mestu naredbe ###
?
#include <iostream>
struct A{
A(){}; //podrazumevani konstruktor strukture A
int x;
const int y=1;
mutable int z;
};
int main(){
A a1;
const A a2;
###
}
a2.z=1;
a1.y=1;
a2.y=1;
a1.x=1;
a1.z=1;
a2.x=1;
5. zadatak
Koje funkcije su ispravne, jer vraćaju referencu na "živ" objekat?
int& f(int &i){int r=i; return r; }
int& f(int i){return i; }
int& f(int &i){return *new int(i); }
int& f(int &i){int &r=*new int(i); return r; }
int& f(int &i){return i; }
int& f(int &i){int r=*new int(i); return r; }
Objašnjenje: Prva funkcija vraća referencu na lokalnu promenljivu u koju je kopirana vrednost. Druga funkcija isto, ali se kopiranje dešava pri prosleđivanju argumenata. Šesta funkcija alocira objekat na hipu, ali onda njegovu vrednost kopira u lokalnu promenljivu pa vraća referencu na tu promenljivu.
6. zadatak
Koji od sledećih iskaza su tačni na jeziku C++?
- Klasa može imati više privatnih sekcija.
- Iz metoda pozvanog za neki objekat se ne može pristupiti privatnom atributu drugog objekta iste klase.
- Javnoj sekciji klase mogu pristupati samo javni metodi klase, a privatnoj sekciji samo privatni metodi.
- Članovima u privatnoj sekciji klase može pristupati samo javni metod iste klase.
- Podrazumevana sekcija klase je javna.
7. zadatak
Za nepromenljiv i nepostojan (const volatile
) objekat klase mogu da se pozivaju metodi te klase sa navedenim sledećim modifikatorima (koji određuju prirodu tekućeg objekta):
inline
const
volatile
const volatile
- bez modifikatora
8. zadatak
Neka je data definicija klase Test
class Test{
Test(){}
};
Za koje od sledećih linija koda u funkciji main() će prevodilac prijaviti grešku?
Test test;
Test* test = new Test();
Test test();
Test* test;
Test test{};
Objašnjenje: Podrazumevani konstruktor se nalazi u privatnoj sekciji. Opcija pod c je deklaracija metode a opcija pod d ne pravi objekat uopšte.
9. zadatak
Šta ispisuje dati program na jeziku C++?
#include <iostream>
using namespace std;
class A {
public:
A() { cout << "A"; }
A(int a) { cout << "A" << a; }
};
class B {
A a;
public:
B() { cout << "B"; }
B(int b) { cout << "B" << b; }
};
class C {
B b;
A a;
public:
C() { cout << "C"; }
C(int c) : a(c) { cout << "C" << c; }
};
int main() {
C c(1);
return 0;
}
Odgovor: ABA1C1
Objašnjenje: Inicijalizuje se klasa C konstruktorom sa jednim argumentom. Odatle kreće inicijalizacija njenog atributa tipa B, kada se poziva podrazumevani konstruktor. B sadrži objekat klase A, pa se podrazumevanim konstruktorom inicijalizuje A i ispisuje A. Tada je gotova inicijalizacija atributa klase B i inicijalizacija B se završava ispisivanjem B. Zatim se prelazi na inicijalizaciju atributa tipa A klase C, ali konstruktorom sa jednim argumentom jer tako piše u inicijalizacionoj listi, pa se ispisuje A1. Na kraju se ispisuje C1.
10. zadatak
Koja tvrđenja su tačna za dati programski kod napisan na jeziku C++?
class A {
int i;
public:
A(int ii=2) { i = ii; }
};
- Klasa A ima konverzioni konstruktor.
- Klasa A ima jedan konstruktor.
- Objekat klase A se može stvoriti pozivanjem konstruktora koji nema nijedan parametar.
- Objekat klase A se može stvoriti pozivanjem konstruktora koji ima jedan argument.
- Klasa A nema podrazumevani konstruktor.
Drugi test
1. zadatak
- Isti zadatak se našao i na probnom kolokvijumu za IR.
Koji od sledećih operatora se moraju preklopiti kao nestatički metodi u jeziku C++?
operator()
operator[]
operator<<
operator=
operator+
2. zadatak
- Isti zadatak se našao i na probnom kolokvijumu za IR.
Povezati operatore sa odgovarajućom tipičnom primenom:
- Računanje vrednosti polinoma u tački operator()
- Pametni pokazivač operator->
- Asocijativni pristup elementu zbirke operator[]
3. zadatak
- Isti zadatak se našao i na probnom kolokvijumu za IR.
Šta ispisuje sledeći program na programskom jeziku C++? Ukoliko se program ne prevodi u polje za odgovor treba upisati vrednost 0.
#include <iostream>
class B;
class A {
public:
A(int i) {}
A(const B &b) { std::cout << "1"; }
A& operator=(const A& a) { std::cout << "2"; return *this; }
};
class B {
public:
operator A() { std::cout << "3"; return 1; }
};
int main() {
B b;
A a(1);
a = b;
}
Odgovor: 32
Objašnjenje: Operator = klase A prima argument tipa A, pa mora da se desi konverzija iz B u A. Ovde izgleda kao da je konverzija dvoznačna, jer može da se izvrši i preko konverzionong konstruktora klase A, i preko operatora konverzije klase B, ali nije. Naime, konverzioni konstruktor klase A prima argument koji ima const
kvalifikator, dok operator konverzije nema const
specifikator, pa konverzija ide preko operatora konverzije i ispisuje se 3. Nakon toga se izvrši operator dodele i ispiše 2.
4. zadatak
Koje tvrdnje su tačne?
- Operator
delete
može imati proizvoljan broj argumenata. - U preklopljenom operatoru
new
treba, kao poslednju naredbu, napisati eksplicitan poziv konstruktora klase za koju se operator preklapa. - Klasa može imati više preklopljenih
delete
operatora za pojedinačne objekte. - Operatori
new
idelete
se preklapaju kao statički metodi klase. - Klasa može imati više preklopljenih operatora
new
za nizove.
5. zadatak
Koja od sledećih tvrdnji u vezi izvođenja klasa su tačna u jeziku C++?
- Iz klase označene modifikatorom
final
nije moguće dalje izvođenje. - Dozvoljeno je sledeće izvođenje:
class A : B { }; class B : A { };
- Podrazumevan način izvođenja je zaštićen (
protected
). - Izvedena klasa ne nasleđuje konstruktore, destruktor i operatore
operator=
iz osnovne klase. - Izvođenje može biti javno (
public
), zaštićeno (protected
) ili privatno (private
).
6. zadatak
Koji iskazi su tačni? Izaberite jedan odgovor:
- Privatnim izvođenjem uspostavlja se relacija sadržanja između objekta izvedene klase i nasleđenog podobjekta osnovne klase.
- Objekat zaštićeno izvedene klase je jedna vrsta objekta osnovne klase u svakoj globalnoj funkciji.
- Objekat javno izvedene klase nasleđuje samo implementaciju osnovne klase, ne i ugovor.
- Kod privatnog izvođenja nasleđuje se ugovor osnovne klase.
- Javnim izvođenjem se samo uspostavlja relacija sadržanja između objekta izvedene klase i nasleđenog podobjekta osnovne klase.
7. zadatak
Šta ispisuje sledeći program na jeziku C++?
#include <iostream>
using namespace std;
class A {
public:
A() { cout << "A"; }
};
class C {
public:
C() { cout << "C"; }
};
class B: public A {
C c; A a;
public:
B():c(), A(), a() { cout << "B"; }
};
int main() {
B b[2];
}
- CAABCAAB
- ACBACB
- AACBAACB
- ACABACAB
Objašnjenje: Prvo se inicijalizuje podobjekat A, a zatim atributi tipa C a zatim A, i na kraju se poziva konstruktor B. Redosled u inicijalizatorskoj listi nije bitan. Pošto se prave dva objekta u nizu, ispisuje se dva puta.
8. zadatak
Šta ispisuje sledeći programski kod:
#include <iostream>
using namespace std;
class O {
public:
virtual void m() { cout << "1"; }
};
class I : public O {
public:
virtual void m() override { cout << "2"; }
};
int main() {
O * p = new I();
O o = *p;
p->m();
(*p).m();
o.m();
return 0;
}
Odgovor: 221
Objašnjenje: Poziv metode preko objekta je nepolimorfan (treći slučaj), dok je poziv preko reference ili pokazivača polimorfan (prvi i drugi slučaj). Dereferenciranje vraća referencu, u ovom slučaju ne mora da se desi kopija objekta.
9. zadatak
Šta treba da stoji umesto *** da bi dati program na jeziku C++ ispisao BA? Izaberite jedan ili više odgovora.
#include <iostream>
using namespace std;
class A {
public:
***
};
class B: public A {
public:
~B() { cout << "B"; }
};
int main() {
A *a = new B();
delete a;
}
- ~A() { cout << "A"; }
- ~A() { cout << "BA"; }
- virtual ~A() { cout << "BA"; }
- virtual ~A() { cout << "A"; }
Objašnjenje: Ukoliko je destruktor virtuelan, pozvaće se destruktor i osnovne klase. Validna alternativa jeste da nevirtuelni destruktor samo ispiše traženi tekst.
10. zadatak
Koje tvrdnje su tačne?
- Višestrukim izvođenjem se smatra izvođenje iz više klasa koje nisu u uzajamnom odnosu izvođenja (nasleđivanja).
- Višestrukim izvođenjem se smatra izvođenje u kojem je jedna klasa roditelj većeg broja klasa.
- Višestrukim izvođenjem se smatra izvođenje iz već izvedene klase.
- Višestrukim izvođenjem se smatra izvođenje iz klase iz koje su već izvedene neke druge klase.
- Višestrukim izvođenjem se nasleđuju ugovori i implementacije svih roditeljskih klasa.
IR kolokvijum
1. zadatak
Prostor na steku se dodeljuje:
- Lokalnim statičkim objektima
- Globalnim statičkim objektima
- Argumentima (parametrima) funkcija
- Dinamičkim objektima
- Lokalnim automatskim objektima
2. zadatak
Šta ispisuje sledeći program na programskom jeziku C++?
#include <iostream>
int& f(int &x) {
return ++x;
}
int main() {
int x = 1;
int z = 1;
auto y = f(z);
y++;
std::cout << x << y << z;
}
- 133
- 233
- Programski kod se ne prevodi.
- 132
- 232
Objašnjenje: auto
, za razliku od decltype
ne zadržava da li je tip bio referenca ili pokazivač, pa je tip y
samo int
i promena nad y
se ne oslikava nad z
.
3. zadatak
Koje tvrđenje je tačno?
- Mehanizam preklapanje[sic] imena funkcija je potpuno statički, koja funkcija će se pozvati određuje se u vreme prevođenja.
- Mehanizam preklapanje[sic] imena funkcija je potpuno dinamički, koja funkcija će se pozvati određuje se u vreme izvršavanja.
- Mehanizam preklapanje[sic] imena funkcija je potpuno statički, koja funkcija će se pozvati određuje se u vreme izvršavanja.
- Mehanizam preklapanje[sic] imena funkcija je potpuno dinamički, koja funkcija će se pozvati određuje se u vreme prevođenja.
4. zadatak
Koja tvrđenja su tačna na programskom jeziku C++?
- Metodi
int f() & { return 1; }
iint f() && { return 3; }
mogu postojati u istoj klasi. - Metodi
int f() & { return 1; }
iint f() const & { return 3; }
mogu postojati u istoj klasi. - Metodi
int f() & { return 1; }
ivoid f() & { }
mogu postojati u istoj klasi.
5. zadatak
Šta ispisuje sledeći program napisan na programskom jeziku C++? Ukoliko se program ne prevodi unesite X.
#include <iostream>
using namespace std;
class A
{
private:
int b = 2;
int c = 3;
public:
A() : c(b+1), b(7) { b--; a = 2; }
void pisi() { cout << a << b << c; }
private:
int a = 1;
};
int main()
{
A obj;
obj.pisi();
return 0;
}
Odgovor: 268
Objašnjenje: Pri inicijalizaciji objekta klase A polja b, c i a se prvo inicijalizuju na 7 (iz konstruktora), 8 (7+1) i 1, a zatim se u konstruktoru b smanji na 6 a a postavi na 2.
6. zadatak
Šta ispisuje dati program na jeziku C++?
#include <iostream>
using namespace std;
class A {
static int stID;
int ID = ++stID;
public:
A() {}
A(const A& a) {}
A(A&& a) {}
~A() { cout << ID; }
};
int A::stID = 0;
void f1(A& a) {}
void f2(A a) {}
int main() {
A x;
for(int i = 0; i < 3; i++){
A* y = new A;
if (i == 1) f2(*y);
if (i == 2) f1(*y);
}
return 0;
}
Odgovor: 41
Objašnjenje: Stvara se objekat x, sa ID od 1. U prvoj iteraciji petlje se samo stvara objekat y sa ID od 2. U drugoj iteraciji petlje se ponovo stvara objekat y sa ID od 3, ali se prosleđuje metodi u kojoj se kopira i dobija ID od 4. Na kraju te metode se uništava i ispisuje 4. U trećoj iteraciji petlje se ponovo stvara objekat y sa ID od 5, pa se prosleđuje metodi u kojoj se ne kopira. Na kraju programa se uništava objekat x i ispisuje 1. Dinamički alocirani objekti nisu eksplicitno oslobođeni, pa njihovi destruktori nisu pozvani i memoriju koju oni zauzimaju će osloboditi operativni sistem.
7. zadatak
Koja su tvrđenja tačna za prijateljske (friend
) funkcije i klase?
- Ako je klasa
A
prijatelj klaseB
i klasaB
prijatelj klaseC
, onda je i klasaA
prijatelj klaseC
. - Funkcija
m()
koja je prijatelj klasiA
može biti globalna funkcija. - Ako klasa
A
proglasi klasuB
za prijatelja, metodi klaseA
imaju pristup do privatnih polja klaseB
- Prijateljstvo između klasa je simetrična relacija.
- Funkcija
m()
koja je prijatelj klasiA
može biti metod klaseB
.
8. zadatak
Koji od sledećih operatora se moraju preklopiti kao nestatički metodi u jeziku C++?
operator[]
operator=
operator()
operator+
operator<<
9. zadatak
Povezati operatore sa odgovarajućom tipičnom primenom:
- Računanje vrednosti polinoma u tački operator()
- Pametni pokazivač operator->
- Asocijativni pristup elementu zbirke operator[]
10. zadatak
Šta ispisuje sledeći program na programskom jeziku C++? Ukoliko se program ne prevodi u polje za odgovor treba upisati vrednost 0.
#include <iostream>
class B;
class A {
public:
A(int i) {}
A(const B &b) { std::cout << "1"; }
A& operator=(const A& a) { std::cout << "2"; return *this; }
};
class B {
public:
operator A() { std::cout << "3"; return 1; }
};
int main() {
B b;
A a(1);
a = b;
}
Odgovor: 32
Objašnjenje: Operator = klase A prima argument tipa A, pa mora da se desi konverzija iz B u A. Ovde izgleda kao da je konverzija dvoznačna, jer može da se izvrši i preko konverzionong konstruktora klase A, i preko operatora konverzije klase B, ali nije. Naime, konverzioni konstruktor klase A prima argument koji ima const
kvalifikator, dok operator konverzije nema const
specifikator, pa konverzija ide preko operatora konverzije i ispisuje se 3. Nakon toga se izvrši operator dodele i ispiše 2.