ОО1/Фебруар 2021
- За питања са више одговора, тачни одговори су подебљани и уоквирени
- За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
- Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:
1. zadatak
Koja od navedenih definicija najbolje odgovara apstrakciji kao elementnu objektno orijentisanog stila programiranja?
- Odvajanje interfejsa klase od njene implementacije koja se sakriva od korisnika.
- Prepoznavanje bitnih svojstava skupova sličnih objekata i opisivanje zajedničkom klasom.
- Mogućnost kreiranja apstraktnih klasa i funkcija članica.
- Pristupačnost određenim članovima klase navođenjem prava pristupa.
2. zadatak
Koji je tip promenljive i u sledećem isečku koda napisanom na jeziku C++?
const int j = 1;
const auto k = j;
auto i = new int + k;
const int*int*intconst int* constconst intint *const
Objašnjenje: Tip promenljive k će biti const int, jer joj se samo dodeljuje j, ali će tip i biti int* jer operator new vraća pokazivač koji nije konstantan i na njega se samo dodaje pomeraj k.
3. zadatak
U klasi X je definisan metod m.
class X {
public:
void m(X *x) const {}
};
Kog tipa je pokazivač this u metodu m?
const X * constX*X * constXconst X *
Objašnjenje: Pokazivač this ne može da se menja, pa je podrazumevano tipa X* const. Kada se doda const modifikator na metodu m, to znači da polja objekta ne mogu da se menjaju unutar metode i zato taj pokazivač postaje const X* const.
4. zadatak
Koji od sledećih tvrđenja su tačni za statičke metode klase X:
- Nemaju pokazivač
this - Imaju pravo pristupa svim članovima X
- Imaju javno pravo pristupa nezavisno od sekcije u kojoj se nalaze
- Mogu da pristupaju statičkim atributima i funkcijama prostim imenovanjem
- Moraju se definisati van tela klase
5. zadatak
Šta ispisuje sledeći program na programskom jeziku C++? (Ukoliko smatrate da se program ne prevodi, unesite NP. Ukoliko smatrate da dolazi do greške pri izvršavanju, unesite X)
#include <iostream>
using namespace std;
int main() {
int brojevi[] = {1, 2, 3};
int* pk = brojevi;
pk++;
int& ref = *pk;
ref++;
cout << brojevi[0] << brojevi[1] << brojevi[2];
return 0;
}
Rešenje: 133
Objašnjenje: Pokazivač pk će na početku pokazivati na početak niza brojevi, zatim biti uvećan za 1 pa će pokazivati na drugi element niza. Referenca ref od stvaranja pokazuje na isti element kao pk, ali se primenom operatora ++ nad referencom ne menja njena lokacija (jer se ona ne može promeniti) nego vrednost člana niza na koji pokazuje, pa će u nizu biti brojevi 1, 3 i 3 koji se ispod i ispisuju.
6. zadatak
Kog tipa je parametar premeštajućeg operatora dodele za klasu X?
Rešenje: X&&
7. zadatak
Koji od ponuđenih prefiksa opšte (nespecijalizovane) šablonske (genreičke[sic]) funkcije ili klase su ispravni?
template<typename T>template<typename T, int N>template<int N>template<typename T, typename U>template<>
Objašnjenje: template<> se može koristiti samo za specijalizacije šablona.
8. zadatak
Na koje sve načine je moguće definisati klasu B izvedenu iz klase A?
class B : virtual A {...};class B : protected public A {...};class B : override A {...};class B : A {...};class B : public A {...};
9. zadatak
Šta ispisuje sledeći program na programskom jeziku C++?
#include <iostream>
using namespace std;
class A {
private:
int a;
public:
A(int aa=0) : a(aa) {}
void m() { cout << 1; }
friend ostream& operator<<(ostream& os,const A& a) { return os << a.a; }
};
class B: public A{
private:
int a;
public:
B(int aa) : a(aa) {}
int m() { cout << 2; return 2; }
};
int main() {
A a(5);
B b(7);
A* ap = &b;
a.m();
b.m();
ap->m();
cout << a << b;
}
Rešenje: 12150
Objašnjenje: Prve dve metode će biti pozvane regularno nad klasama A i B. Poziv nevirtuelne metode nad pokazivačem na klasu A, iako zapravo pokazuje na izvedenu klasu B, će pozvati metodu klase A. Na kraju se poziva operator<< iz osnovne klase, koji preko reference na klasu A ispisuje vrednosti polja a osnovnih klasa (za objekat klase A ispisuje njegovo polje a, dok za objekat klase B ispisuje polje a njegovog podobjekta klase A) jer, iako se pristupa preko reference, pristup poljima nikada ne koristi virtuelni mehanizam.
10. zadatak
Šta ispisuje sledeći program na programskom jeziku C++? Zanemariti upozorenja prevodioca
#include <iostream>
using namespace std;
class IzuzO {};
class IzuzI : public IzuzO {};
int main() {
try
{
try
{
throw new IzuzI();
}
catch (IzuzI&) { cout << 1; }
catch (IzuzO&) { cout << 2; }
catch (...) { cout << 3; throw; }
}
catch (IzuzO*) { cout << 4; }
catch (IzuzI*) { cout << 5; }
catch (...) { cout << 6; }
return 0;
}
Rešenje: 34
Objašnjenje: Hvatanje po referenci neće uhvatiti izuzetak tipa pokazivača na klasu IzuzI, pa se poziva opšti rukovaoc greškama koji ispisuje 3 i ponovo baca grešku. Nakon toga, prvi sledeći rukovaoc će uhvatiti grešku jer je greška pokazivačkog tipa na tip koji može standardno da se konvertuje u pokazivački tip rukovaoca i ispisaće 4.