ОО1/К2 2023

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

K2 2023. godine održan je 12. meseca i trajao je 20min.

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


1. zadatak

Koje od sledećih operatora je moguće preklopiti za klasne tipove?

  1. () (operator za poziv funkcija)
  2. -> (operator za posredan pristup članovima klase preko pokazivača)
  3. ?: (operator za uslovni izraz)
  4. :: (operator za razrešenje dosega)
  5. . (operator za pristup članu klase)

2. zadatak

Šta ispisuje sledeći program na programskom jeziku C++?

Napomena 1: Unarna varijanta operatora * ima viši prioritet u odnosu na binarnu

Napomena 2: Ukoliko smarate da se kod ne prevodi, upisati NP. Ukoliko smatrate da se dešava greška u izvršavanju upisati G.

#include <iostream>
using namespace std;
class A {
public:
    friend const A &operator*(const A &a) {
        cout << "1";
        return a;
    }
    friend const A &operator*(const A &a1, const A &a2) {
        cout << "2";
        return a1;
    }
};
int main() {
    A x;
    A *y = &x;
    A **z = &y;
    *x**y***z;
}

Odgovor: 122 Objašnjenje: Dati izraz se evaluira kao: (*x) * (*y) * (**z). Samo u *x slučaju se poziva unarni * nad const A&, a u ostalim podizrazima imamo preklopljen binarni operator * nad dve const A&

3. zadatak

Šta važi za operator = na jeziku C++?

  1. Ukoliko ne postoji premeštajuća varijanta operatora dodele (suspendovana je i implicitna premeštajuća dodela) u slučaju kada je desni operand nestajuća vrednost (eng. expiring value), koristiće se postojeća kopirajuća varijanta operatora dodele
  2. Ukoliko operator nije eksplicitno definisan, na mestu poziva operatora će se pozvati konstruktor kopije
  3. Postoji kopirajuća i premeštajuća varijanta operatora =
  4. Operator je moguće preklopiti kao nestatički metod klase
  5. Operator je moguće preklopiti kao globalnu prijateljsku funkciju

4. zadatak

Koje od navedenih osobina su zajedničke za preklapanje operatora -> i prefiksnog ++ operatora?

  1. Preklapanjem je mouće promeniti prioritet operatora
  2. Preklapaju se kao binarni operatori
  3. Preklapaju se kao unarni operatori
  4. Moraju da se preklope kao statički metod klse
  5. Tip rezultata mora biti jednak tipu operanda

5. zadatak

Koje tvrdnje su tačne za programski jezik C++?

  1. Prilikom konstrukcije objekta jednostruko izvedene klase prvo se izvrašava telo konstruktora izvedene klase
  2. Konstruktor jednostruko izvedene klase koji nije delegirajući mora u listi inicijalizatora imati inicijalizator osnovne klase ukoliko osnovna klasa nema podrazumevani konstruktor
  3. Ukoliko osnovna klasa ima podrazumevani konstruktor, tada se nikada neće izvršavati nijedan konstruktor osnovne klase prilikom konstrukcije objekta izvedene klase.
  4. Ukoliko osnovna klasa ima dostupan podrazumevani konstruktor, tada je moguće definisati konstruktor izvedene klase sa praznom listom inicijalizatora

6. zadatak

Šta ispisuje dati program na programskom jeziku C++?

#include <iostream>
using namespace std;
class A {
protected:
    int k;
public:
    A(int kk) : k(kk++) {
        k = ++kk;
    }
};
class B : public A {
public:
    B(int kk) : A(kk) { k = kk; }
    int dohvatiK() { return k; }
};
int main() {
    B b(2);
    cout << b.dohvatiK();
}

Izaberite jedan odgovor:

  1. 2
  2. Dati program se ne prevodi
  3. 3
  4. 4

Objašnjenje: Kada se poziva konstruktor klase A, njemu se prosleđuje kopija vrednost kk, pa nikakvi bočni efekti nemaju uticaj na kk iz konstruktora B. Zatim se u telu konstruktora B k inicijalizuje na kk, čime se gazi bilo kakva dodela iz konstruktora A, jer k je zaštićen član pa je dostupan i u klasi A i u klasi B

7. zadatak

Za dati kod napisanna programskom jeziku C++ odrediti za koje definicije metoda m u klasi B će se navedeni program ispravno izvršavati (biti bez greške u prevođenju i izvršavanju, ignorisati curenje memorije)

#include <iostream>
using namespace std;
class A {
public:
    virtual A* m(A& a) {return new A();}
};
class B : public A {
public:
    // ovde nedostaje definicija metoda m
};
int main() {
    B b;
    b.m(b);
    return 0;
}

Izaberite jedan ili više odgovora odgovor:

  1. void *m(A &a) override {return new B();}
  2. A *m(A &a) {return new B();}
  3. B *m(B &b) override {return new B();}
  4. B *m(A &a) override {return new B();}
  5. A *m(B &b) {return new B();}

Objašnjenje: Ako se radi nadjačavanje (override) potpis metoda mora biti identičan osim povratne vrednosti, koja ako je bila pokazivаč ili referenca na osnovnu klasu u osnovnom metodu, u nadjačanom metodu može biti referenca ili pokazivač na izvedenu klasu. Ako nema ključne reči override potpis može biti proizvoljan, jer ako nije isti (ili skoro isti, sa gorenavedenim izuzetkom) samo će se izvršiti preklapanje imena.

8. zadatak

Šta ispisuje sledeći program na programskom jeziku C++? Napomena: Ukoliko smarate da se kod ne prevodi, upisati NP. Ukoliko smatrate da se dešava greška u izvršavanju upisati G.

#include <iostream>
using namespace std;
class B {
public:
    B() { cout << "B"; }
    ~B() { cout << "~B"; }
};
class C : public B {
public:
    C() { cout << "C"; }
    ~C() { cout << "~C"; }
};
int main() {
    B *b = new C();
    delete b;
    return 0;
}

Odgovor: BC~B Objašnjenje: Da bi se pozvao destruktor podklase preko pokazivača tipa nadklase, destruktor mora biti deklarisan kao virtuelan u nadklasi

9. zadatak

Šta ispisuje sledeći program na programskom jeziku C++?

#include <iostream>
#include <typeinfo.h>
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';
}

Izaberite jedan odgovor:

  1. c
  2. d
  3. cd
  4. bcd
  5. baca se izuzetak bad_cast

Objašnjenje: Dynamic_cast proverava tip pokazivanog (referenciranog) objekta, zanemarujući tip pokazivača (reference) i ne dozvoljava downcast. Ako se downcast pokuša s pokazivačem vratiće nullptr, a ako se pokuša s referencom baciće bad_cast izuzetak. Niko živi ne zna koji će im typeinfo.h

10. zadatak

Kojim redosledom se izvršavaju konstr?uktori za klasu koja je izvedena iz više osnovnih klasa od kojih su neke virtuelne osnovne klase? Redosled je određen rastućim brojevima. Prvo se izvršava 1, pa 2...

  1. 1 Konstruktori virtuelnih osnovnih klasa
  2. 2 Konstruktori nevirtuelnih osnovnih klasa
  3. 3 Konstruktori atributa izvedene klase
  4. 4 Telo konstruktora izvedene klase