ОО1/Јануар 2022
- За питања са више одговора, тачни одговори су подебљани и уоквирени
- За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
- Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:
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];
}
- Postoji problem curenja memorije.
- Niz ima tačno 3 elementa.
- Postoji problem sa visećim pokazivačem.
- 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;
???
}
pk++;(*pk)++;pk = "xyz";char c = pk[1];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;
???
}
obj.a = 5;obj.b = 5;obj.y = 5;obj.x = 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();
}
- Program se ne prevodi.
- 1
- 11
- 12
- 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;
}
- Program se ne prevodi.
- 0120
- 0102
- 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++?
- Ako se preklopi operator
newgubi se podrazumevani konstruktor. - Kada se preklapa
(), operator može da primi proizvoljno parametara ali svi moraju da budu standardnog tipa. - Funkcijska klasa je klasa koja preklapa barem jedan od operatora
() [] ->. - Klasa može imati više preklopljenih
newoperatora. newoperator se preklapa kao statički metod.
7. zadatak
Šta je tačno od sledećih navoda o apstraktnim klasama na jeziku C++?
- Apstraktna klasa je ona koja ima barem jednu apstraktnu metodu.
- Statički metod može da bude apstraktan.
- Klasa može biti apstraktna ako su joj destruktor i sve metode konkretne.
- Da bi izvedena klasa bila konkretna, mora da konkretizuje sve apstraktne metode.
- Apstraktna klasa se označava sa
abstractu definiciji preclass.
8. zadatak
Šta je tačno od sledećih navoda o šablonskim klasama na jeziku C++?
- Može se izvoditi iz šablonskih klasa.
- Šablonska klasa ne može imati virtuelne metode.
- Šablonski metodi ne mogu biti virtuelni.
- ??
- ??
9. zadatak
Šta je tačno od sledećih navoda o virtuelnim metodama na jeziku C++?
- Destruktor može da bude virtuelan.
- Konstruktor može da bude virtuelan.
- Statički metod može da bude virtuelan.
- Prijateljska globalna funkcija može biti virtuelna.
- Nestatički metod može da bude virtuelan.
10. zadatak
Šta je tačno od sledećih navoda o rukovaocima izuzetaka na jeziku C++?
- Rukovalac tipa
doublemože da prihvati izuzetke tipaint. - Rukovalac tipa
...prihvata sve tipove izuzetaka. - Rukovalac tipa
intmože da prihvati izuzetke tipadouble. - Izuzetak može da se baci iz
trybloka. - Izuzetak ne može da se baci iz
catchbloka.
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;
####
}
p++;*p = 1;p = &b;std::cout << p;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 ***?
y.b = 2;X::c = 5;y.a = 1;X::d = 3;y.d = 4;
5. zadatak
Šta od sledećeg važi za preklapanje operatora na programskom jeziku C++?
- Ukoliko je levi operand binarne operacije standardnog tipa mora se preklopiti kao metod odgovarajuće klase.
- Operator
[]se mora preklopiti kao globalna prijateljska funkcija. - Operator dodele se mora preklopiti kao nestatički metod klase.
- Operator
()se mora preklopiti kao nestatički metod klase. - 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++?
- Objekti izvedene klase sadrže bezimeni podobjekat osnovne klase.
- Preko objekata izvedene klase zaštićenim članovima osnovne klase se pristupa isto kao javnim članovima izvedene klase.
- Jezici koji podržavaju izvođenje se nazivaju objektno bazirani jezici.
- Modifikator
finalse koristi za klasu koja nije izvedena ni iz jedne klase. - 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;
}
- bxyz
- bxbyz
- byxz
- bybxz
- 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?
- 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. - Operator za dinamičku konverziju se mora primenjivati za svaku konverziju naviše (
upcast) koja se vrši u vreme izvršenja programa. - Operator za dinamičku konverziju se može primeniti na pokazivač ili referencu na objekat nepolimorfne osnovne klase.
- Operator za dinamičku konverziju primenjen na pokazivač tipa osnovne klase vraća
nullptrako konverzija u pokazivač tipa izvedene klase ne uspeva. - 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:
void m() noexcept;void m() throw ();void m() throw (I1, I2, I3);void m() throw (I1);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:
void K::m(T t) { ... }template <class T> void K<T>::m(T t) { ... }void K<T>::m(T t) { ... }