ОО1/Пробни тестови 2020 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (IR 3. zadatak rešenje - Proširenja C str. 60)
м (→‎5. zadatak: slovna greska :))
 
(Није приказано 14 међуизмена 4 корисника)
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
* Za pitanja sa više odgovora, tačni odgovori su <span class="solution-example">podebljani i uokvireni</span>.
{{rešenja}}
* Za pitanja za koje se odgovori unose, tačni odgovori su podvučeni i sakriveni: <span class="spoiler-example">ovako</span>.
* Pritisnite na sledeće dugme kako biste ih sakrili ili otkrili: <span class="unhide-spoilers unhide-solutions"></span>


== 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">
# <span class="solution"><code>a2.z=1;</code></span>
# <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>
# <span class="solution"><code>a1.x=1;</code></span>
# <code class="solution">a1.x=1;</code>
# <span class="solution"><code>a1.z=1;</code></span>
# <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>
# <span class="solution"><code>int& f(int &i){return *new int(i); }</code></span>
# <code class="solution">int& f(int &i){return *new int(i); }</code>
# <span class="solution"><code>int& f(int &i){int &r=*new int(i); return r; }</code></span>
# <code class="solution">int& f(int &i){int &r=*new int(i); return r; }</code>
# <span class="solution"><code>int& f(int &i){return i; }</code></span>
# <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>
# <span class="solution"><code>const volatile</code></span>
# <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">
# <span class="solution"><code>Test test;</code></span>
# <code class="solution">Test test;</code>
# <span class="solution"><code>Test* test = new Test();</code></span>
# <code class="solution">Test* test = new Test();</code>
# <code>Test test();</code>
# <code>Test test();</code>
# <code>Test* test;</code>
# <code>Test* test;</code>
# <span class="solution"><code>Test test{};</code></span>
# <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-&gt;">
# Računanje vrednosti polinoma u tački <span class="spoiler">operator()</span>
# Pametni pokazivač <span class="spoiler">operator-&gt;</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
# Argumentima (parametrima) funkcija
# <span class="solution">Argumentima (parametrima) funkcija</span>
# Dinamičkim objektima
# Dinamičkim objektima
# Lokalnim automatskim objektima
# <span class="solution">Lokalnim automatskim objektima</span>
</div>
</div>


Ред 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 da se program ne prevodi unesite X.
Š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">
# <span class="solution"><code>operator[]</code></span>
# <code class="solution">operator[]</code>
# <span class="solution"><code>operator=</code></span>
# <code class="solution">operator=</code>
# <span class="solution"><code>operator()</code></span>
# <code class="solution">operator()</code></span>
# <code>operator+</code>
# <code>operator+</code>
# <code>operator<<</code>
# <code>operator<<</code>
Ред 304: Ред 499:


=== 9. zadatak ===
=== 9. zadatak ===
Povezati operatore sa odgovarajućom tipičnom primenom:
<div data-solution="select" data-options="operator[], operator(), operator-&gt;">
# Računanje vrednosti polinoma u tački <span class="spoiler">operator()</span>
# Pametni pokazivač <span class="spoiler">operator-&gt;</span>
# Asocijativni pristup elementu zbirke <span class="spoiler">operator[]</span>
</div>
=== 10. zadatak ===
=== 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):

  1. ne mora menjati ni ponovo prevoditi i testirati.
  2. ne mora menjati, ali se mora ponovo prevoditi i testirati.
  3. ne mora menjati, mora ponovo prevoditi, ali se ne mora ponovo testirati.
  4. mora menjati i ponovo prevoditi i testirati.
  5. 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?

  1. decltype Y;
  2. using namespace Y;
  3. using Y::X;
  4. namespace Y.X;
  5. 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;
    ###
}
  1. a2.z=1;
  2. a1.y=1;
  3. a2.y=1;
  4. a1.x=1;
  5. a1.z=1;
  6. a2.x=1;

5. zadatak

Koje funkcije su ispravne, jer vraćaju referencu na "živ" objekat?

  1. int& f(int &i){int r=i; return r; }
  2. int& f(int i){return i; }
  3. int& f(int &i){return *new int(i); }
  4. int& f(int &i){int &r=*new int(i); return r; }
  5. int& f(int &i){return i; }
  6. 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++?

  1. Klasa može imati više privatnih sekcija.
  2. Iz metoda pozvanog za neki objekat se ne može pristupiti privatnom atributu drugog objekta iste klase.
  3. Javnoj sekciji klase mogu pristupati samo javni metodi klase, a privatnoj sekciji samo privatni metodi.
  4. Članovima u privatnoj sekciji klase može pristupati samo javni metod iste klase.
  5. 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):

  1. inline
  2. const
  3. volatile
  4. const volatile
  5. 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?

  1. Test test;
  2. Test* test = new Test();
  3. Test test();
  4. Test* test;
  5. 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; }
};
  1. Klasa A ima konverzioni konstruktor.
  2. Klasa A ima jedan konstruktor.
  3. Objekat klase A se može stvoriti pozivanjem konstruktora koji nema nijedan parametar.
  4. Objekat klase A se može stvoriti pozivanjem konstruktora koji ima jedan argument.
  5. 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++?

  1. operator()
  2. operator[]
  3. operator<<
  4. operator=
  5. operator+

2. zadatak

Isti zadatak se našao i na probnom kolokvijumu za IR.

Povezati operatore sa odgovarajućom tipičnom primenom:

  1. Računanje vrednosti polinoma u tački operator()
  2. Pametni pokazivač operator->
  3. 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?

  1. Operator delete može imati proizvoljan broj argumenata.
  2. U preklopljenom operatoru new treba, kao poslednju naredbu, napisati eksplicitan poziv konstruktora klase za koju se operator preklapa.
  3. Klasa može imati više preklopljenih delete operatora za pojedinačne objekte.
  4. Operatori new i delete se preklapaju kao statički metodi klase.
  5. 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++?

  1. Iz klase označene modifikatorom final nije moguće dalje izvođenje.
  2. Dozvoljeno je sledeće izvođenje:
    class A : B { };
    class B : A { };
    
  3. Podrazumevan način izvođenja je zaštićen (protected).
  4. Izvedena klasa ne nasleđuje konstruktore, destruktor i operatore operator= iz osnovne klase.
  5. Izvođenje može biti javno (public), zaštićeno (protected) ili privatno (private).

6. zadatak

Koji iskazi su tačni? Izaberite jedan odgovor:

  1. Privatnim izvođenjem uspostavlja se relacija sadržanja između objekta izvedene klase i nasleđenog podobjekta osnovne klase.
  2. Objekat zaštićeno izvedene klase je jedna vrsta objekta osnovne klase u svakoj globalnoj funkciji.
  3. Objekat javno izvedene klase nasleđuje samo implementaciju osnovne klase, ne i ugovor.
  4. Kod privatnog izvođenja nasleđuje se ugovor osnovne klase.
  5. 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];
}
  1. CAABCAAB
  2. ACBACB
  3. AACBAACB
  4. 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;
}
  1. ~A() { cout << "A"; }
  2. ~A() { cout << "BA"; }
  3. virtual ~A() { cout << "BA"; }
  4. 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?

  1. Višestrukim izvođenjem se smatra izvođenje iz više klasa koje nisu u uzajamnom odnosu izvođenja (nasleđivanja).
  2. Višestrukim izvođenjem se smatra izvođenje u kojem je jedna klasa roditelj većeg broja klasa.
  3. Višestrukim izvođenjem se smatra izvođenje iz već izvedene klase.
  4. Višestrukim izvođenjem se smatra izvođenje iz klase iz koje su već izvedene neke druge klase.
  5. Višestrukim izvođenjem se nasleđuju ugovori i implementacije svih roditeljskih klasa.

IR kolokvijum

1. zadatak

Prostor na steku se dodeljuje:

  1. Lokalnim statičkim objektima
  2. Globalnim statičkim objektima
  3. Argumentima (parametrima) funkcija
  4. Dinamičkim objektima
  5. 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;
}
  1. 133
  2. 233
  3. Programski kod se ne prevodi.
  4. 132
  5. 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?

  1. Mehanizam preklapanje[sic] imena funkcija je potpuno statički, koja funkcija će se pozvati određuje se u vreme prevođenja.
  2. Mehanizam preklapanje[sic] imena funkcija je potpuno dinamički, koja funkcija će se pozvati određuje se u vreme izvršavanja.
  3. Mehanizam preklapanje[sic] imena funkcija je potpuno statički, koja funkcija će se pozvati određuje se u vreme izvršavanja.
  4. 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++?

  1. Metodi int f() & { return 1; } i int f() && { return 3; } mogu postojati u istoj klasi.
  2. Metodi int f() & { return 1; } i int f() const & { return 3; } mogu postojati u istoj klasi.
  3. Metodi int f() & { return 1; } i void 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?

  1. Ako je klasa A prijatelj klase B i klasa B prijatelj klase C, onda je i klasa A prijatelj klase C.
  2. Funkcija m() koja je prijatelj klasi A može biti globalna funkcija.
  3. Ako klasa A proglasi klasu B za prijatelja, metodi klase A imaju pristup do privatnih polja klase B
  4. Prijateljstvo između klasa je simetrična relacija.
  5. Funkcija m() koja je prijatelj klasi A može biti metod klase B.

8. zadatak

Koji od sledećih operatora se moraju preklopiti kao nestatički metodi u jeziku C++?

  1. operator[]
  2. operator=
  3. operator()
  4. operator+
  5. operator<<

9. zadatak

Povezati operatore sa odgovarajućom tipičnom primenom:

  1. Računanje vrednosti polinoma u tački operator()
  2. Pametni pokazivač operator->
  3. 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.