ОО1/Питалице

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Na ovoj stranici skupljeni su razni ispitni primeri koji su se možda pojavili na ispitu ali im se ne zna rok pojavljivanja ili jednostavno nije bilo dovoljno dobro formulisanih pitalica iz tog roka kako bi se odvojili u stranicu roka.

  • За питања са више одговора, тачни одговори су подебљани и уоквирени
  • За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
  • Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:

1. zadatak

Šta je od navedenog tačno:

  1. Objekat javno izvedene klase nasleđuje samo implementaciju osnovne klase, a ne i ugovor
  2. Objekat zaštićene izvedene klase je jedna vrsta objekta osnovne klase u svakoj globalnoj funkciji
  3. Kod privatnog izvođenja nasleđuje se ugovor osnovne klase
  4. Javnim izvođenjem samo se uspostavlja relacija sadržaja između objekta izvedene klase i nasleđenog podobjekta osnovne klase
  5. Ništa od ponuđenog

2. zadatak

Šta ispisuje sledeći kod:

#include <iostream>
using namespace std;

template <typename T> class Klasa {
public:
    template <typename U> void m (U u) { cout << "1"; }
    void m (int u) {cout << "2"; }
};

template <typename T> class Klasa <T*> {
public:
    template <typename U> void m (U u) { cout << "3"; }
    void m (int u) {cout << "4"; }
};

int main () {
    Klasa <int*>().m<float>(9);
    Klasa <int> ().m(9);
    Klasa <int> ().m('a');
    Klasa <int*>().m<int>(2);
}

Odgovor: 3213

Objašnjenje: Prva metoda radi nad klasom parametrizovanom sa int*, pa se bira specijalizacija, a metoda je parametrizovana sa float (umesto int, ali trebalo bi da je činjenica da je eksplicitno parametrizovana dovoljna) pa se bira šablonska metoda. Druga metoda radi nad klasom parametrizovanom sa int, pa se bira osnovni šablon, i poziva nešablonska metoda jer parametar tipa int tačno odgovara parametrima metode bez konverzije. Treća metoda je slično kao druga, ali ne odgovara parametrima nešablonske metode bez konverzije, pa se poziva šablonska. Četvrta metoda je kao prva.

3. zadatak

Šta ispisuje sledeći kod:

#include <iostream>
using namespace std;

class Klasa {};

int main () {
    try {
        try {
            cout << "0";
            throw Klasa();
            cout << "1";
        }
        catch (...) { cout << "2"; }
        cout << "3";
    }
    catch (Klasa i) {cout << "4"; }
    cout << "5";
    return 0;
}

Odgovor: 0235

Objašnjenje: Prvo se ispisuje 0. 1 se ne ispisuje jer je pre toga bačen izuzetak. Izuzetak se hvata u catch grani za sve rukovaoce i ispisuje 2, pa se nastavlja regularnim rokom i ispisuju 3 i 5.

4. zadatak

Šta važi za apstraktne klase?

  1. ne mogu se praviti objekti apstraktne klase zato što ona ne može imati destruktor
  2. natklasa apstraktne klase je obavezno apstraktna klasa
  3. klasa izvedena iz apstraktne klase mora da redefiniše sve nasleđene apstraktne metode
  4. ne mogu se stvarati objekti apstraktne klase već samo pokazivači i refence na nju, koji mogu pokazivati (upućivati) na objekte konkretnih izvedenih klasa koje nisu apstraktne

5. zadatak

Šta ispisuje sledeći kod:

#include <iostream>
using namespace std;

void f() noexcept {}
void g() noexcept (!noexcept (f())) {}
void h() noexcept (noexcept (g())) {}
void m() noexcept (noexcept (f()) || noexcept (g())) {}

int main () {
    cout << (noexcept (f()) ? 1:0);
    cout << (noexcept (g()) ? 1:0);
    cout << (noexcept (h()) ? 1:0);
    cout << (noexcept (m()) ? 1:0);
    return 0;
}

Odgovor: 1001

Objašnjenje: Funkcija f je noexcept. Funkcija g je obrnuto od noexcept za f, tako da nije noexcept. Funkcija h je isto noexcept koliko i g, tako da nije noexcept. Funkcija m je noexcept ukoliko su f ili g noexcept, tako da je noexcept.

6. zadatak

Šta ispisuje dati program:

#include <iostream>
using namespace std;

class A {
public:
    static int i;
    A() { i++; }
};
int A::i = 0;

class B : virtual public A {
public:
    B() { i++; }
};

class C : public A {
public:
    C() { i++; }
};

class D : public B, public C {
public:
    void pisi() { cout << i; }
};

int main () {
    D d;
    d.pisi();
    return 0;
}

Odgovor: 4

Objašnjenje: Zbog toga što C nije virtuelno izvedena iz A, A će biti nasleđena dva puta i dva puta će se pozvati konstruktor za podobjekat te klase. Pored toga se pozivaju konstruktori za B i C, i na kraju se taj broj ispisuje u konstruktoru D.

7. zadatak

Šta ispisuje sledeći kod:

#include <iostream>
using namespace std;

class A {
public:
    virtual void m() {}
};
class B : public A {};
class C : public B {};

int main () {
    A *pa = new B();
    B *pb = new C();
    B *b = dynamic_cast <B*>(pa);
    C *c = dynamic_cast <C*> (pa);
    C *d = dynamic_cast <C*> (pb);
    if (b == nullptr) cout << 'b';
    if (c == nullptr) cout << 'c';
    if (d == nullptr) cout << 'd';
    return 0;
}
  1. baca se izuzetak bad_cast
  2. d
  3. cd
  4. c
  5. bcd

Objašnjenje: Slova se ispisuju kada nije moguće uraditi neki kast. Ovde jedino nije moguće uraditi kastovanje pa u pokazivač na C, jer je pa pokazivač na objekat klase B i ne može se ponašati kao klasa C.

8. zadatak

Šta ispisuje sledeći kod:

#include <iostream>
using namespace std;

class A {
public:
    A(int i) {
        if (i < 5) cout << 'a';
        else throw 'b';
    }
};

int main() {
    int i = 1;
    if (noexcept(A(i++))) cout << i;
    else cout << 2*i;
    return 0;
}

Odgovor: 2

Objašnjenje: Konstruktor klasa A može da baci izuzetak i zbog toga nije noexcept. Izraz noexcept se evaluira u vreme prevođenja a ne izvršavanja, i zbog toga se i ne povećava pri proveri da li je konstruktor klase A noexcept. Pošto nije, ispisuje se dvostruka vrednost i koje nije povećano za 1, a to je 2.

9. zadatak

(Oktobar 2020, 9. zadatak) Zaokružiti ispravne izraze, ako je dat sledeći kod:

template <typename T=int, int k=10>
class Niz { T niz[k]; };
  1. Niz<int*, 20> n1;
  2. Niz<int*&, 20> n2;
  3. Niz<20> n3;
  4. Niz<> n4;
  5. Niz<double, 5.5> n5;
  6. Niz n6;

Objašnjenje: Odgovor pod f) se prevodi samo od C++17 i novijih standarda. Unutar klase se pravi niz podataka, a u odgovoru pod b) se prosleđuje tip reference, što je nemoguće. U odgovoru pod c) prvi argument je konstanta a ne tip, a u odgovoru pod e) se umesto int konstante prosleđuje double.

10. zadatak

Šta ispisuje sledeći kod:

#include <iostream>
using namespace std;

class O {};
class I: public O {};

int main() {
    try {
        throw I();
        cout << "1";
    }
    catch(O o) {
        cout << "5";
        try {
            throw I();
            cout << "3";
        }
        catch(I i) { cout << "2"; }
    }
    catch(I i) { cout << "4"; }
    cout << "8";
    return 0;
}

Odgovor: 528

Objašnjenje: Rukovaoci izuzetaka se gledaju redom kojim pišu u kodu, pa se prvo nailazi na rukovalac tipa O i u njemu se hvata izuzetak (pošto tip izvedene klase odgovara rukovaocu osnovne). U rukovaocu se baca i odmah posle hvata izuzetak tipa izvedene klase, pa se ispisuje 2. Na kraju se program završava regularno i ispisuje još 8.

11. zadatak

Šta ispisuje sledeći program (upisati -1 ukoliko se program ne prevodi):

#include <iostream>
using namespace std;

class A {
public:
    virtual void m1() = 0;
    virtual void m2() = 0;
};
class B : public A {
public:
    void m1() { cout << "1"; }
};
class C : public A {
public:
    void m2() { cout << "2"; }
};
class D : public B, public C {
public:
    void m2() { cout << "3"; }
};
int main() {
    D d;
    d.m2();
    return 0;
}

Odgovor: -1

Objašnjenje: Ne prevodi se, zbog toga što je D apstraktna klasa. Metode m1 i m2 se nadjačavaju u klasama B i C, ali pošto nisu virtuelno izvedene postoje dva podobjekta klase A i jedan par metoda koji nije nadjačan uopšte. U klasi D se nadjačava metod m2, ali metod m1 preko klase C još uvek nije nadjačan, pa je D i dalje apstraktna klasa.

12. zadatak

(Jul 2020, 10. zadatak) Šta važi za osnovnu i izvedenu klasu, ako obe imaju prazna tela, a izvođenje je javno:

  1. Izvedena klasa nasleđuje konstruktor
  2. Izvedena klasa ne nasleđuje destruktor
  3. Izvedena klasa ima podrazumevani konstruktor sa praznim telom
  4. Izvedena klasa ima destruktor koji ima prazno telo
  5. Izvedena klasa ima automatski generisan kopirajući konstruktor

13. zadatak

Šta ispisuje sledeći program:

#include <iostream>
using namespace std;

class X {
public:
    X() {}
    void m(int i) {
        try {
            if (i == 2) throw 2;
            cout << "1" << endl;
        }
        catch (double k) { cout << "2" << endl; }
    }
};

int main() {
    X x;
    try {
        x.m(2);
    }
    catch (int k) { cout << "3" << endl; }
    return 0;
}

Odgovor: 3

Objašnjenje: Ulazi se u metodu i pošto je argument 2 baca se argument tipa int i ne hvata u rukovaocu unutar metode tipa double, već onom van metode.

14. zadatak

Koliko će se zvezdica ispisati?

#include <iostream>
using namespace std;

void f(int i, int& j) { i++; j++; }

int main(){
    for (int i = 0, j = 0; i < 3 && j < 4; f(i, j))
        cout << '*';
    return 0;
}

Odgovor: 4

Objašnjenje: Funkcija f povećava svoj lokalni argument i, ali pošto nije prosleđen po referenci on se ne inkremetira van petlje, pa je efektivan uslov j < 4.

15. zadatak

Šta ispisuje sledeći program:

#include <iostream>
using namespace std;

class A {
    int x, y;
public:
    A(int xx, int yy) : x(xx) , y(yy){}
    double div() { if (y == 0) throw x; return x/y; }
    int mod() { if (y == 0) throw 0; return x % y; }
};

int main() {
    A a(4, 0), aa(3, 5);
    try { cout << a.div(); } catch(int x) { cout << x; }
    try { cout << a.mod(); } catch(int x) { cout << x; }
    try { cout << aa.div(); } catch(int x) { cout << x; }
    try { cout << aa.mod(); } catch(int x) { cout << x; }
    return 0;
}

Odgovor: 4003

Objašnjenje: Prva dva poziva div i mod će bacati greške vrednosti x (4) i 0 respektivno, pa će se te greške ispisati. Druga dva poziva će ispisati vrednosti te dve operacije, odnosno 0 i 3.

16. zadatak

Zaokruži tačna tvrđenja:

  1. Generičke funkcije ubrzavaju izvršavanje programa
  2. Generičke funkcije ubrzavaju prevođenje
  3. Generičke funkcije i klase omogućavaju bolju reupotrebu koda
  4. Generički mehanizam omogućava generisanje funkcija sa različitim tipovima parametara u toku izvršavanja programa

17. zadatak

Zaokruži tačna tvrđenja:

template <typename T>
void swap (T *a, T *b){
    T c;
    for (int i = 0; i < n; i++) {
        c = a[i];
        a[i] = b[i];
        b[i] = c;
    }
}

Za klasu T mora da postoji:

  1. Podrazumevani konstruktor
  2. Operator dodele vrednosti
  3. Operator []
  4. Kopirajući konstruktor
  5. Metoda koja vrši polimorfnu kopiju

Objašnjenje: Podrazumevanim konstruktorom se stvara objekat c. Operatorom dodele vrednosti se tom objektu dodeljuje drugi objekat iz niza a. Operator [] nije potreban jer se ovde indeksiraju nizovi, a ne poziva taj operator nad samim objektom.

18. zadatak

(Septembar 2020, 6. zadatak) Ako je exception klasa izuzetaka i iz nje je izvedena klasa I, a iz klase I dalje izvedena klasa II, kojim redosledom treba navesti rukovaoce izuzecima (zaokružiti jedno ili više):

  1. exception, I , II , ...
  2. II, I, exception, ...
  3. I, II , exception, ...
  4. II, I, ..., exception
  5. ..., exception, I, II

19. zadatak

Šta ispisuje sledeći program:

#include <iostream>
using namespace std;

template<class T, class U, int I> struct X {
    void f() { cout << "Osnovni sablon" << endl; }
};
template<class T, int I> struct X<T, T*, I> {
    void f() { cout << "Specijalizacija 1" << endl; }
};
template<class T> struct X<int, T*, 10> {
    void f() { cout << "Specijalizacija 2" << endl; }
};

int main() {
    X<int, int*, 10> f;
    f.f();
    return 0;
}
  1. Specijalizacija 1
  2. Specijalizacija 2
  3. Greška jer se pristupa privatnom polju
  4. Greška zbog dvoznačnosti šablona

Objašnjenje: Ovo pitanje može biti jako zbunjujuće jer je na prezentaciji profesora Igora Tartalje pogrešno navedeno da se bira specijalizacija "sa manje parametara". Zapravo, jedna specijalizacija je specijalizovanija od druge kada pokriva podskup kombinacija tipova i konstanti koje pokriva prva. Na primer, specijalizovaniji slučaj prve specijizacije bi bio <T, T*, 10> ili <int, int*, I> jer sve moguće kombinacije tipova koje odgovaraju jednoj od ove dve specijalizacije odgovaraju i prvoj specijalizaciji. Ipak, u ovom zadatku to nije slučaj. Kombinacija <int, char*, 10> odgovara samo drugoj, a <int, int*, 11> samo prvoj specijalizaciji. Zbog ovoga nijedna od njih nije specijalizovaniji slučaj i razrešenje šablona je nemoguće učiniti zbog dvoznačnosti. Profesoru je za ovu grešku rečeno u januaru 2021. godine.

20. zadatak

Šta ispisuje sledeći program:

#include <iostream>
using namespace std;

void fun(int p) {
    try {
        throw p;
    }
    catch (int p) { cout << ++p; throw; }
}

int main() {
    int p = 1;
    try {
        try {
            fun(p);
            cout << ++p;
        }
        catch (int p) { cout << ++p; }
        cout << ++p;
    }
    catch (int p) { cout << ++p; }
    return 0;
}

Odgovor: 222

Objašnjenje: Iz funkcije se baca izuzetak i u njoj se hvata. Pošto se hvata po vrednosti, inkrementiranje će se desiti samo nad lokalnim objektom, a sami objekat izuzetka se neće menjati. Zatim se isti izuzetak kao ranije (neizmenjeni) baca iz funkcije, i hvata u prvom sledećem rukovaocu. Tu se objekat izuzetka koji se opet hvata po vrednosti zove isto kao i promenljiva koja je originalno bila prosleđena funkciji, pa će se inkrementiranje i ispis desiti nad objektom izuzetka. Posle toga, inkrementiranje i ispis se dešava nad originalnom promenljivom.

21. zadatak

Šta ispisuje sledeći program:

#include <iostream>
using namespace std;

int main() {
    int x = 10;
    double y = 1.5;
    decltype(++x - y) a = y-- + 5;
    cout << x << ' ' << y << ' ' << a;
    return 0;
}

Odgovor: 10 0.5 6.5

Objašnjenje: decltype se izračunava pri prevođenju pa se vrednost x ne menja. Pošto je tip u koji mogu da stanu i int i double zapravo double, vrednost a će biti za 5 veća od y, a u tom procesu se y smanjuje za 1.

22. zadatak

Šta ispisuje sledeći program:

#include <iostream>
using namespace std;

class Klasa {};
class Izvedena : public Klasa {};

int main() {
    try {
        throw Izvedena();
    }
    catch (Izvedena * i) { cout << "3"; }
    catch (Klasa i) { cout << "4"; }
    catch (Izvedena i) { cout << "5"; }
    return 0;
}

Odgovor: 4

Objašnjenje: Rukovalac tipa pokazivača ne može hvatati izuzetak koji nije tipa pokazivača. Pošto se rukovaoci gledaju redom, sledeći na listi rukovalaca će biti Klasa i, koji odgovara jer je Izvedena izvedena iz Klasa, pa se ispisuje 4.

23. zadatak

Šta je problem kod definicije funkcije:

class X {
public:
    X operator+(const X& x) const;
};
  1. Ispravna je
  2. Nije ispravna jer za binarni operator + fali još jedan argument
  3. Nije ispravna jer nisu obezbeđene bočne vrednosti
  4. Nije ispravna jer ova funkcija MORA da vraća referencu na lvrednost

24. zadatak

Šta od sledećeg važi za destruktore:

  1. Destruktor nema argumente
  2. Destruktor može imati jedan argument ako ima podrazumevanu vrednost
  3. Destruktor vraća void
  4. Destruktor se može eksplicitno pozvati

25. zadatak

Šta ispisuje sledeći program:

#include <iostream>
using namespace std;

class A {
    int i;
public:
    A(int ii) : i(ii) { cout << i; }
};

class B {
    A a1, a2;
public:
    B(A a11=A(5), A a22=A(6)) : a1(a11), a2(a22) {}
};

int main() {
    int i = 7;
    A a(i);
    B b(a);
    return 0;
}

Odgovor: 76

Objašnjenje: Konstruktor se prvo poziva pri pravljenju objekta a. Pri prosleđivanju tog objekta konstruktoru klase B poziva se kopirajući konstruktor koji ne ispisuje ništa, a za drugi argument se konstruiše objekat klase A sa argumentom 6 kao podrazumevani argument.

26. zadatak

Šta ispisuje sledeći kod:

#include <iostream>
using namespace std;

class X {
public:
    X(int a, int b=0) {
        cout << "1";
    }
    X() { cout << "2"; }
    X(double d) { cout << "3"; }
    X(const X &X) { cout << "4"; }
};

int main() {
    X X1, X2(1), X3(X1), X4(.5);
    return 0;
}

Odgovor: 2143

27. zadatak

Šta je problem kod definisanja operatora +?

class Klasa {
public:
    Klasa operator+(const Klasa& k1, const Klasa& k2);
};
  1. Nema problema.
  2. Nepravilna promena prava pristupa.
  3. Promena n-arnosti operatora.
  4. Prosleđivanje argumenata operatora po referenci.
  5. Ništa od ponuđenog.

Objašnjenje: Ova nestatička metoda ima argument this i dva argumenta klasnog tipa, čineći je trinarnim operatorom.

28. zadatak

Koja naredba je ekvivalentna b-- u kodu?

int a = 5;
int& b = a;
int* c = &a;
  1. nijedna
  2. c--
  3. a--
  4. (*c)--
  5. c = a-1

29. zadatak

Kako se pravilno definiše niz od n celih brojeva, ako n zadaje korisnik tokom izvršavanja?

  1. int niz = new int[n];
  2. int *niz = new int[n];
  3. int niz = new int*[n];
  4. int niz[n];
  5. int *niz[n];

30. zadatak

Šta ispisuje sledeći kod:

class K {
public:
    K(int k) { cout << k; }
};
class A {
    K k2 = 1, k1 = 2;
public:
    A(int i, int j) : k1(i), k2(j) {}
};
int main() {
    A a(3, 4);
    return 0;
}

Odgovor: 43

Objašnjenje: Ovde je fora da je redosled konstrukcije po redosledu navođenja u klasi a ne u inicijalizatorskoj listi.

31. zadatak

Šta ispisuje sledeći kod:

#include <iostream>
using namespace std;

class A {
    int a;
public:
    A() { a = 1; cout << "A"; }
};
class B {
    A a;
public:
    B() { cout << "B"; }
};
class C {
    B b;
    A a;
public:
    C() { cout << "C"; }
};

int main() {
    C c;
    return 0;
}

Odgovor: ABAC

Objašnjenje: Kreće inicijalizacija C. Prvo se inicijalizuje njeno polje tipa B, ali se odmah prelazi na inicijalizaciju polja tipa A od klase tipa B, pa se ispisuje A a zatim B. Inicijalizuje se još jedno bolje tipa A klase C i na kraju se završava inicijalizacija C.

32. zadatak

(Jul 2020, 7. zadatak) Da li su sledeći mehanizmi statički ili dinamički?

  • Generici - statički
  • Preklapanje operatora - statički
  • Polimorfizam - dinamički
  • Preklapanje imena funkcija - statički
  • Obrada izuzetaka - dinamički

33. zadatak

Koje osobine su zajedničke za operatore () i ->:

  1. preklapaju se kao binarni
  2. mogu se preklopiti kao globalna prijateljska funkcija
  3. tip rezultata mora biti jednak tipu operanda
  4. preklapanjem nije moguće promeniti prioritet operatora
  5. rezultat mora biti pokazivačkog tipa

34. zadatak

class T {
public:
    void m(int x) const;
};

Kog je tipa this u metodu m?

  1. T*
  2. const T*
  3. const T&
  4. const T* const
  5. T* const

Objašnjenje: this je obično T* const (konstantni pokazivač). Sa modifikatorom const metode, ono postaje const T* const (konstantni pokazivač na konstantu).

35. zadatak

Šta ispisuje sledeći kod:

#include <iostream>
using namespace std;

class A {
private:
    int i;
public:
    A(int ii) { i = ii; }
    int dohvati() { return i; }
    int operator()() { return 3; }
};
static int a() { return 4; }

int main() {
    A a(2);
    cout << a();
    return 0;
}

Odgovor: 3

36. zadatak

Koju vrednost će imati reg_br?

class A {
    static int reg_br;
    int id = reg_br++;
    int i;
public:
    A(int ii) { i = ii; reg_br = 5; }
};

int A::reg_br = 2;

int main() {
    A a(2);
    return 0;
}

Odgovor: 5

Objašnjenje: Konstruktor se poziva nakon inicijalizatora polja, pa će reg_br prvo biti inkrementirano za 1 a zatim postavljeno na 5.

37. zadatak

Koje tvrdnje za statički kast su tačne?

  1. Koristi se za uklanjanje/dodavanje modifikatora const nekom tipu
  2. Koristi se za konverzije između numeričkih tipova
  3. Koristi se za korisničke konverzije
  4. Koristi se za konverzije tipova podataka koji nisu u logičkoj vezi
  5. Koristi se za konverzije između pokazivačkih tipova
  6. Koristi se za prenosive konverzije
  7. Koristi se za neprenosive konverzije

38. zadatak

Konstruktor neke klase se izvršava:

  1. Kada se izvršava definicija statičkog objekta neke klase
  2. Kada se vrši dodela vrednosti objektu date klase
  3. Kada se konstruktor eksplicitno pozove i stvori se privremeni objekat date klase
  4. Kada se stvara dinamički objekat date klase
  5. Kada se vrši prenos argumenta u parametar date klase po vrednosti
  6. Kada se iz funkcije vraća rezultat tipa date klase po vrednosti

39. zadatak

Koje tvrdnje su ispravne:

  1. Doseg globalne promenljive je od definicije do kraja fajla u kojem je definisana
  2. Doseg klasnog atributa je od mesta gde je naveden do kraja definicije klase
  3. Doseg promenljive definisane u definicije for petlje, prema standardu, je do kraja okružujućeg bloka for petlje
  4. Doseg lokalne promenljive je od početka do kraja bloka u kojem je definisana
  5. Doseg labele je od mesta gde je definisana do kraja tela funkcije

40. zadatak

Upućivač (referenca) na dvrednost je dvrednost:

  1. Tačno
  2. Netačno

41. zadatak

Koje tvrdnje su ispravne:

  1. Objekat klase mora ispoljavati polimorfno ponašanje
  2. Objekat klase je opis korisničkog struktuiranog tipa
  3. Objekat klase je nešto (u memoriji) što ima stanje, ponašanje i identitet
  4. Objekat klase je opis ponašanje srodnih primeraka neke apstrakcije
  5. Objekat u širem smislu je podatak određenog tipa koji u vreme izvršavanja programa ima određeno mesto u memoriji

42. zadatak

(Jul 2020, 1. zadatak) Šta se u kom koraku istorijata objekte paradigme desilo:

Date opcije
Apstrakcija Programski jezik
  • Apstrakcija izraza FORTRAN
  • Apstrakcija kontrole Algol60
  • Apstrakcija podataka Pascal
  1. COBOL
  2. Pascal
  3. Simula 67
  4. Ada
  5. FORTRAN
  6. Algol60

Objašnjenje: Ovi zadaci se obično ne pojavljuju u prva dva roka.

43. zadatak

(Jul 2020, 3. zadatak) Kako se iz glavne funkcije može pristupiti tmp?

namespace A {
    namespace B {
        int tmp = 2;
    }
}

Odgovor: A::B::tmp

44. zadatak

(Septembar 2020, 1. zadatak) Šta ispisuje sledeći program:

#include <iostream>
using namespace std;

class X {
public:
    X() { cout << 'X'; }
    X(char c) { cout << 'X' << c; }
};

class A : virtual X {
public:
    A() : X('a') { cout << 'A'; }
};

class B : X {
public:
    B() : X('b') { cout << 'B'; }
};

class C : virtual X {
public:
    C() : X('c') { cout << 'C'; }
};

class Y : A, virtual B, C {
public:
    Y() { cout << 'Y'; }
};

int main() {
    Y y;
	return 0;
}

Odgovor: XXbBACY

Objašnjenje:

  • Rade se dva obilaska, prvi gde obilazimo sve klase u stablu nasleđivanja po dubini na osnovu redosleda navedenog u definiciji klase i inicijalizujemo virtuelne, a drugi gde obilazimo opet po dubini i inicijalizujemo ostale.
  • Kreće se sa inicijalizacijom Y. Y je prvo nevirtuelno izvedena iz A, pa se obilazi A bez inicijalizacije.
    • A je virtuelno izvedena iz X, pa se inicijalizuje X.
      • Kada se klasa inicijalizuje zbog virtuelnog nasleđivanja, koji konstruktor će se pozvati određuje najplića klasa, u ovom slučaju Y (ovo ne piše na predavanjima). Pošto nije određeno koji se konstruktor poziva u Y, poziva se podrazumevani konstruktor i ispisuje se X.
    • Obilazak A je završen i prelazi se na B, koja je virtuelno izvedena pa se zato inicijalizuje.
      • B je nevirtuelno izvedena iz X, pa se X ponovo inicijalizuje (jer je ranije bila inicijalizovana virtuelno), ovog puta pozivajući konstruktor koji definiše B, pa se ispisuje Xb.
    • Inicijalizacija B je završena i ispisuje se B. Prelazi se na C, koje je virtuelno izvedeno iz X, ali pošto je X već inicijalizovana virtuelno ovde se ne dešava inicijalizacija.
  • Prelazi se na drugu fazu. Inicijalizuje se A.
    • Podobjekat X klase A je već inicijalizovan, pa se samo ispisuje A i prelazi na inicijalizaciju B.
    • B je već inicijalizovano, prelazi se na inicijalizaciju C.
    • Podobjekat X klase C je već inicijalizovan, pa se samo ispisuje C.
  • Na kraju inicijalizacije se ispisuje Y.

45. zadatak

(Septembar 2020, 4. zadatak) Stvarni argument šablona može biti:

  1. Ime šablonske klase
  2. Ime prave klase
  3. Funkcija
  4. Šablonska klasa s parametrima
  5. Parametar

46. zadatak

(Kolokvijum IR 2021)Šta ispisuje sledeći segment koda napisan na programskom jeziku C++:

enum E {a=2, b, c, d, e, f=3, g, h=3};
cout << E::b << E::f << E::h;

Odgovor: 333

Objašnjenje: Polja enumeracije se numerišu redom brojevima za jedan većim od prethodnog počevši od prvog kojem je eksplicitno zadata vrednost ili od 0.