ОО1/Јануар 2022

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

G1

1. zadatak

Šta je tačno za navedeni isečak koda na jeziku C++?

#include <iostream>

using namespace std;

int main() {
    int niz[] = { 1, 2, 3 };
    int i;
    cin >> i;
    cout << niz[i];
}
  1. Postoji problem curenja memorije.
  2. Niz ima tačno 3 elementa.
  3. Postoji problem sa visećim pokazivačem.
  4. Ako se na standardni ulaz upiše 1, program će ispisati 1.

2. zadatak

Šta je moguće staviti umesto ??? na ovom isečku koda na jeziku C++?

#include <iostream>
using namespace std;

int main() {
    char slova[] = "slova";
    char* const pk = slova;
    ???
}
  1. pk++;
  2. (*pk)++;
  3. pk = "xyz";
  4. char c = pk[1];
  5. pk[0] = 'a';

Objašnjenje: pk je konstantni pokazivač na char što znači da ne može da se promeni na šta on pokazuje, tako da su prvi i treći odgovori netačni. Drugi i peti odgovori su tačni jer je samo pokazivač konstantan, a ne promenljiva na koju pokazuje.

3. zadatak

Šta je moguće staviti umesto ??? na ovom isečku koda na jeziku C++?

#include <iostream>
using namespace std;

class X {
    int a;
public:
    static int y;
    int b;
private:
    static int x;
};

int X::y = 1;
int X::x = 2;

int main() {
    X obj;
    ???
}
  1. obj.a = 5;
  2. obj.b = 5;
  3. obj.y = 5;
  4. obj.x = 5;
  5. X::y = 5;

4. zadatak

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

#include <iostream>
using namespace std;

class X {
public:
    static X&& kreiraj() { X* pk = new X(); return static_cast<X&&>(*pk); }
    void metod()& { cout << 1; }
    void metod()&& { cout << 2; }
};

int main() {
    X x;
    x.metod();
    X::kreiraj().metod();
}
  1. Program se ne prevodi.
  2. 1
  3. 11
  4. 12
  5. 21

5. zadatak

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

#include <iostream>

using namespace std;

class A {
public:
    A() { cout << "0"; }
};

class B{
    A a;
public:
    B() { cout << "1"; }
};

class C : public B {
    A a;
public:
    C() { cout << "2"; }
};

int main() {
    C c;
}
  1. Program se ne prevodi.
  2. 0120
  3. 0102
  4. Nijedan od ponuđenih odgovora.

Objašnjenje: Kreće se sa inicijalizacijom C, pa se prelazi na inicijalizaciju njenog podobjekta klase B. B sadrži polje tipa A pa se prvo inicijalizuje A i ispisuje 0, a zatim završava inicijalizacija B i ispisuje 1. Nakon toga se prelazi na inicijalizaciju polja klase A u C i ispisuje 0, i na kraju se izvršava konstruktor C koji ispisuje 2.

6. zadatak

Šta je tačno od sledećih navoda o preklapanju operatora na jeziku C++?

  1. Ako se preklopi operator new gubi se podrazumevani konstruktor.
  2. Kada se preklapa (), operator može da primi proizvoljno parametara ali svi moraju da budu standardnog tipa.
  3. Funkcijska klasa je klasa koja preklapa barem jedan od operatora () [] ->.
  4. Klasa može imati više preklopljenih new operatora.
  5. new operator se preklapa kao statički metod.

7. zadatak

Šta je tačno od sledećih navoda o apstraktnim klasama na jeziku C++?

  1. Apstraktna klasa je ona koja ima barem jednu apstraktnu metodu.
  2. Statički metod može da bude apstraktan.
  3. Klasa može biti apstraktna ako su joj destruktor i sve metode konkretne.
  4. Da bi izvedena klasa bila konkretna, mora da konkretizuje sve apstraktne metode.
  5. Apstraktna klasa se označava sa abstract u definiciji pre class.

8. zadatak

Šta je tačno od sledećih navoda o šablonskim klasama na jeziku C++?

  1. Može se izvoditi iz šablonskih klasa.
  2. Šablonska klasa ne može imati virtuelne metode.
  3. Šablonski metodi ne mogu biti virtuelni.
  4. ??
  5. ??

9. zadatak

Šta je tačno od sledećih navoda o virtuelnim metodama na jeziku C++?

  1. Destruktor može da bude virtuelan.
  2. Konstruktor može da bude virtuelan.
  3. Statički metod može da bude virtuelan.
  4. Prijateljska globalna funkcija može biti virtuelna.
  5. Nestatički metod može da bude virtuelan.

10. zadatak

Šta je tačno od sledećih navoda o rukovaocima izuzetaka na jeziku C++?

  1. Rukovalac tipa double može da prihvati izuzetke tipa int.
  2. Rukovalac tipa ... prihvata sve tipove izuzetaka.
  3. Rukovalac tipa int može da prihvati izuzetke tipa double.
  4. Izuzetak može da se baci iz try bloka.
  5. Izuzetak ne može da se baci iz catch bloka.

G3

1. zadatak

Šta ispisuje sledeći segment koda napisan na programskom jeziku C++?

#include <iostream>
using namespace std;

int i = 7;
int main() {
    for (int i = 0; i < 3; i++) {
        if (int i = 1) {
            cout << i;
        }
    }
    cout << i;
    return 0;
}

Odgovor: 1117

Objašnjenje: Uslov će uvek biti ispunjen i lokalna promenljiva koja se ispisuje u petlji će uvek biti 1. Na kraju svega toga, ispisuje se globalna promenljiva (lokalna promenljiva je izašla iz dosega).

2. zadatak

Šta može da stoji umesto #### da bi se kod napisan na jeziku C++ uspešno preveo?

#include <iostream>

int main() {
    int a = 1, b = 2;
    int * const p = &a;
    ####
}
  1. p++;
  2. *p = 1;
  3. p = &b;
  4. std::cout << p;
  5. std::cout << *p;

3. zadatak

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

#include <iostream>
using namespace std;

class Klasa {
public:
    void metoda() & { cout << "1"; }
    void metoda() && { cout << "2"; }
};

int main(){
    Klasa &&dRef = Klasa();
    dRef.metoda();
    return 0;
}

Odgovor: 1

Objašnjenje: Referenca na dvrednost je lvrednost.

4. zadatak

Ukoliko su date sledeće datoteke "X.h" i "main.cpp":

// datoteka X.h
class X {
    int a;
private:
    static int b;
public:
    static int c;
    int d;
};
// datoteka main.cpp
#include "X.h"

int X::b = 1;
int X::c = 1;

int main() {
    X y;
    ***
}

koja od ovih navedenih naredbi ispravno zamenjuje ***?

  1. y.b = 2;
  2. X::c = 5;
  3. y.a = 1;
  4. X::d = 3;
  5. y.d = 4;

5. zadatak

Šta od sledećeg važi za preklapanje operatora na programskom jeziku C++?

  1. Ukoliko je levi operand binarne operacije standardnog tipa mora se preklopiti kao metod odgovarajuće klase.
  2. Operator [] se mora preklopiti kao globalna prijateljska funkcija.
  3. Operator dodele se mora preklopiti kao nestatički metod klase.
  4. Operator () se mora preklopiti kao nestatički metod klase.
  5. Binarni operator + je moguće preklopiti i kao metod klase i kao globalnu prijateljsku funkciju.

6. zadatak

Šta od sledećeg važi za izvođenje na programskom jeziku C++?

  1. Objekti izvedene klase sadrže bezimeni podobjekat osnovne klase.
  2. Preko objekata izvedene klase zaštićenim članovima osnovne klase se pristupa isto kao javnim članovima izvedene klase.
  3. Jezici koji podržavaju izvođenje se nazivaju objektno bazirani jezici.
  4. Modifikator final se koristi za klasu koja nije izvedena ni iz jedne klase.
  5. Kada se neka klasa izvede iz klase X, potrebno je izvršiti ponovno prevođenje klase X.

7. zadatak

Šta ispisuje sledeći program?

#include <iostream>
using namespace std;

class B {
public:
    B() { std::cout << "b"; }
};

class X : virtual public B {
public:
    X() { std::cout << "x"; }
};

class Y : virtual public B {
public:
    Y() { std::cout << "y"; }
};

class Z : public X, public Y {
public:
    Z() { std::cout << "z"; }
};

int main() {
    Z z;
}
  1. bxyz
  2. bxbyz
  3. byxz
  4. bybxz
  5. Program se ne prevodi.

Objašnjenje: Prvi primer redosleda konstrukcije na kraju prezentacije iz izvođenja profesora Igora Tartalje.

8. zadatak

Koje tvrdnje u vezi operatora za dinamičku konverziju (dynamic_cast) su tačne?

  1. Operator za dinamičku konverziju primenjen na referencu tipa osnovne klase pri neuspešnoj konverziji u referencu na izvedenu klasu baca izuzetak tipa bad_cast.
  2. Operator za dinamičku konverziju se mora primenjivati za svaku konverziju naviše (upcast) koja se vrši u vreme izvršenja programa.
  3. Operator za dinamičku konverziju se može primeniti na pokazivač ili referencu na objekat nepolimorfne osnovne klase.
  4. Operator za dinamičku konverziju primenjen na pokazivač tipa osnovne klase vraća nullptr ako konverzija u pokazivač tipa izvedene klase ne uspeva.
  5. Operator za dinamičku konverziju garantuje da će se konverzija u vreme izvršenja pravilno izvršiti i da će objekat biti konvertovan u ciljni objekat.

9. zadatak

Ako su I1, I2, I3 i I4 klase izuzetaka i ako je u osnovnoj klasi A deklarisan metod:

virtual void m() throw (I1, I2, I3);

deklaracija metoda m() u izvedenoj klasi B može da bude:

  1. void m() noexcept;
  2. void m() throw ();
  3. void m() throw (I1, I2, I3);
  4. void m() throw (I1);
  5. void m() throw (I2, I4);

10. zadatak

Ako je generička klasa definisana na sledeći način:

template <class T> class K { void m(T t); };

metod m može da bude definisan izvan klase K na sledeći način:

  1. void K::m(T t) { ... }
  2. template <class T> void K<T>::m(T t) { ... }
  3. void K<T>::m(T t) { ... }