ОО1/Јануар 2021

Извор: SI Wiki
< ОО1
Датум измене: 30. јун 2021. у 14:58; аутор: Fedja (разговор | доприноси) (pomeren <div>)
(разл) ← Старија измена | Тренутна верзија (разл) | Новија измена → (разл)
Пређи на навигацију Пређи на претрагу
  • За питања са више одговора, тачни одговори су подебљани и уоквирени
  • За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
  • Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:

1. zadatak

Povežite tipove objekata sa njihovim životnim vekovima.

Date opcije
Tip objekta Životni vek
  1. Dinamički objekat e
  2. Statički objekat a
  3. Automatski objekat d
  4. Privremeni objekat b
  1. Od definicije do kraja glavne funkcije
  2. Kratak i nedefinisan
  3. Nepostojan
  4. Od definicije do kraja oblasti važenja
  5. Neposredno kontroliše programer
  6. Određuje prevodilac

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; }
};
  1. Klasa A ima implicitno definisani podrazumevani konstruktor.
  2. Klasa A ima samo 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.

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;
}
  1. K::E* e = K::novi(5); cout << e->n;
  2. void* e = K::novi(5);
  3. E* e = K::novi(5); cout << e->n;
  4. Ništa od navedenog
  5. 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:

Date opcije
Operatori Broj argumenata
  1. operator! a
  2. operator/ b
  3. operator() d
  1. 0
  2. 1
  3. 2
  4. Proizvoljan broj argumenata
  5. Operator se ne može preklopiti kao nestatička metoda

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:
    ???
};
  1. void m1() { }
  2. void m2() { }
  3. void m3() { }
  4. void m2() override { }
  5. void m3() override { }
  6. 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:

  1. X je javno izvedeno iz R
  2. X je privatno izvedeno iz R
  3. R i X su isti tip
  4. R je javno izvedeno iz X
  5. R je privatno izvedeno iz X

9. zadatak

Generički mehanizam je:

  1. dinamički
  2. statički
  3. 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.