OO1/Januar 2021
- За питања са више одговора, тачни одговори су подебљани и уоквирени
- За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
- Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:
1. zadatak
Povežite tipove objekata sa njihovim životnim vekovima.
Tip objekta | Životni vek |
---|---|
|
|
2. zadatak
Šta ispisuje sledeći kod na programskom jeziku C++?
#include <iostream>
int& f(int & param) {
return param;
}
int main() {
int a = 0;
decltype(f(++a)) b = f(a);
auto &c = f(a);
b++;
c++;
std::cout << a << b << c;
return 0;
}
Odgovor: 222
Objašnjenje: decltype(f(++a))
se prevodi kao tip int&
jer je to povratna vrednost funkcije f
, ali se samo f(++a)
ne izvršava, tako da a
ostaje nepromenjeno a b
postaje referenca na a
. auto
obično ne zadržava referencu, ali pošto je ovde napisano auto &c
to znači da će c
sigurno biti referenca na povratnu vrednost funkcije, tako da i c
postaje referenca na a
. Nakon toga se dvaput inkrementira a
i ispisuju tri iste vrednosti (2), jer sve ti promenljive pokazuju na istu.
3. zadatak
- Zadatak sličan ovome se pojavio kao 10. zadatak na probnom testu te godine.
Koja tvrđenja su tačna za dati programski kod napisan na jeziku C++?
class A {
int i;
public:
A(int ii) { i = ii; }
};
- Klasa A ima implicitno definisani podrazumevani konstruktor.
- Klasa A ima samo 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.
Objašnjenje: Pošto je napravljen konverzioni konstruktor, više ne postoji implicitno definisani podrazumevani konstruktor, ali i dalje postoje implicitno definisani kopirajući i premeštajući.
4. zadatak
Šta se može iskoristiti umesto *** kako bi se sledeći kod prevodio bez grešaka?
#include <iostream>
using namespace std;
class K {
struct E {
E* sledeci;
int n;
};
public:
static E* novi(int n) {
E* e = new E;
e->n = n;
e->sledeci = nullptr;
return e;
}
};
int main() {
***
return 0;
}
K::E* e = K::novi(5); cout << e->n;
void* e = K::novi(5);
E* e = K::novi(5); cout << e->n;
- Ništa od navedenog
K::novi(5);
Objašnjenje: E
se nalazi u privatnoj sekciji klase K
tako da se tom imenu ne može pristupiti. S druge strane, svi pokazivači imaju istu veličinu, pa je zato vraćeni pokazivač moguće dodeliti promenljivoj pokazivačkog tipa na void
.
5. zadatak
Koliko argumenata mogu prihvatati sledeći operatori ukoliko se preklapaju kao nestatičke metode:
Operatori | Broj argumenata |
---|---|
|
|
6. zadatak
Koje sve definicije metoda mogu da se nađu umesto ???:
class A {
public:
virtual void m1() { }
void m2() { }
virtual void m3() final { }
};
class B : public A {
public:
???
};
void m1() { }
void m2() { }
void m3() { }
void m2() override { }
void m3() override { }
- Ništa od navedenog
Objašnjenje: m1
može da se nađe u izvedenoj klasi i sa override
i bez jer je virtuelna, slaže se potpis i može se nadjačati. m2
može da se nađe u izvedenoj klasi bez override
, jer se tako sakriva metod iz osnovne klase, ali ne može sa override
jer nije virtuelna pa se ne može samo nadjačati. m3
se ne može definisati uopšte jer je konačna i deklaracije i sa i bez override
bi se tretirale kao pokušaj nadjačavanja metode iz osnovne klase, što ne sme.
7. zadatak
Koja ključna reč mora da stoji ispred naziva destruktora polimorfne klase kako bi se destruktor izvedene klase iz te polimorfne klase pozivao prilikom uništavanja dinamičkog objekta izvedene klase preko pokazivača na osnovnu korišćenjem delete
?
Odgovor: virtual
8. zadatak
Rukovaoc tipa R prihvata izuzetak tipa X ako:
- X je javno izvedeno iz R
- X je privatno izvedeno iz R
- R i X su isti tip
- R je javno izvedeno iz X
- R je privatno izvedeno iz X
9. zadatak
Generički mehanizam je:
- dinamički
- statički
- statički i dinamički
10. zadatak
Šta ispisuje sledeći kod na programskom jeziku C++?
#include <iostream>
using namespace std;
template <typename T>
void f(T p) { cout << 1; }
template <typename T>
void f(T* p) { cout << 2; }
template <>
void f(int* p) { cout << 3; }
int main() {
int* p = nullptr;
f(p);
return 0;
}
Odgovor: 3
Objašnjenje: Treća deklaracija šablona najviše odgovara zadatim parametrima pa se prilikom prevođenja ona bira.