ОО1/Фебруар 2021 — разлика између измена
м (+data-solutions) |
м (Dodata objašnjenja) |
||
| Ред 20: | Ред 20: | ||
<div class="abc-list" data-solution="single"> | <div class="abc-list" data-solution="single"> | ||
# <syntaxhighlight lang="cpp" inline>const int*</syntaxhighlight> | # <syntaxhighlight lang="cpp" inline>const int*</syntaxhighlight> | ||
# | # <syntaxhighlight lang="cpp" inline class="solution">int*</syntaxhighlight> | ||
# <syntaxhighlight lang="cpp" inline>int</syntaxhighlight> | # <syntaxhighlight lang="cpp" inline>int</syntaxhighlight> | ||
# <syntaxhighlight lang="cpp" inline>const int* const</syntaxhighlight> | # <syntaxhighlight lang="cpp" inline>const int* const</syntaxhighlight> | ||
| Ред 26: | Ред 26: | ||
# <syntaxhighlight lang="cpp" inline>int *const</syntaxhighlight> | # <syntaxhighlight lang="cpp" inline>int *const</syntaxhighlight> | ||
</div> | </div> | ||
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation">Tip promenljive <code>k</code> će biti <code>const int</code>, jer joj se samo dodeljuje <code>j</code>, ali će tip <code>i</code> biti <code>int*</code> jer operator <code>new</code> vraća pokazivač koji nije konstantan i na njega se samo dodaje pomeraj <code>k</code>.</span> | |||
== 3. zadatak == | == 3. zadatak == | ||
| Ред 37: | Ред 38: | ||
Kog tipa je pokazivač <code>this</code> u metodu <code>m</code>? | Kog tipa je pokazivač <code>this</code> u metodu <code>m</code>? | ||
<div class="abc-list" data-solution="single"> | <div class="abc-list" data-solution="single"> | ||
# | # <syntaxhighlight lang="cpp" inline class="solution">const X * const</syntaxhighlight> | ||
# <syntaxhighlight lang="cpp" inline>X*</syntaxhighlight> | # <syntaxhighlight lang="cpp" inline>X*</syntaxhighlight> | ||
# <syntaxhighlight lang="cpp" inline>X * const</syntaxhighlight> | # <syntaxhighlight lang="cpp" inline>X * const</syntaxhighlight> | ||
| Ред 43: | Ред 44: | ||
# <syntaxhighlight lang="cpp" inline>const X *</syntaxhighlight> | # <syntaxhighlight lang="cpp" inline>const X *</syntaxhighlight> | ||
</div> | </div> | ||
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation">Pokazivač <code>this</code> ne može da se menja, pa je podrazumevano tipa <code>const X*</code>. Kada se doda <code>const</code> modifikator na metodu <code>m</code>, to znači da polja objekta ne mogu da se menjaju unutar metode i zato taj pokazivač postaje <code>const X* const</code>.</span> | |||
== 4. zadatak == | == 4. zadatak == | ||
| Ред 70: | Ред 72: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Rešenje: <span class="spoiler" data-solution="text">133</span> | '''Rešenje:''' <span class="spoiler" data-solution="text">133</span> | ||
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation">Pokazivač <code>pk</code> će na početku pokazivati na početak niza <code>brojevi</code>, zatim biti uvećan za 1 pa će pokazivati na drugi element niza. Referenca <code>ref</code> od stvaranja pokazuje na isti element kao <code>pk</code>, ali se primenom operatora <code>++</code> 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.</span> | |||
== 6. zadatak == | == 6. zadatak == | ||
| Ред 80: | Ред 84: | ||
Koji od ponuđenih prefiksa opšte (nespecijalizovane) šablonske (genreičke<sup>[sic]</sup>) funkcije ili klase su ispravni? | Koji od ponuđenih prefiksa opšte (nespecijalizovane) šablonske (genreičke<sup>[sic]</sup>) funkcije ili klase su ispravni? | ||
<div class="abc-list" data-solution="multiple"> | <div class="abc-list" data-solution="multiple"> | ||
# | # <syntaxhighlight lang="cpp" inline class="solution">template<typename T></syntaxhighlight> | ||
# | # <syntaxhighlight lang="cpp" inline class="solution">template<typename T, int N></syntaxhighlight> | ||
# | # <syntaxhighlight lang="cpp" inline class="solution">template<int N></syntaxhighlight> | ||
# | # <syntaxhighlight lang="cpp" inline class="solution">template<typename T, typename U></syntaxhighlight> | ||
# <syntaxhighlight lang="cpp" inline>template<></syntaxhighlight> | # <syntaxhighlight lang="cpp" inline>template<></syntaxhighlight> | ||
</div> | </div> | ||
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation"><code>template<></code> se može koristiti samo za specijalizacije šablona.</span> | |||
== 8. zadatak == | == 8. zadatak == | ||
Na koje sve načine je moguće definisati klasu B izvedenu iz klase A? | Na koje sve načine je moguće definisati klasu B izvedenu iz klase A? | ||
<div class="abc-list" data-solution="multiple"> | <div class="abc-list" data-solution="multiple"> | ||
# | # <syntaxhighlight lang="cpp" inline class="solution">class B : virtual A {...};</syntaxhighlight> | ||
# <syntaxhighlight lang="cpp" inline>class B : protected public A {...};</syntaxhighlight> | # <syntaxhighlight lang="cpp" inline>class B : protected public A {...};</syntaxhighlight> | ||
# <syntaxhighlight lang="cpp" inline>class B : override A {...};</syntaxhighlight> | # <syntaxhighlight lang="cpp" inline>class B : override A {...};</syntaxhighlight> | ||
# | # <syntaxhighlight lang="cpp" inline class="solution">class B : A {...};</syntaxhighlight> | ||
# | # <syntaxhighlight lang="cpp" inline class="solution">class B : public A {...};</syntaxhighlight> | ||
</div> | </div> | ||
| Ред 130: | Ред 135: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Rešenje: <span class="spoiler" data-solution="text">12150</span> | '''Rešenje:''' <span class="spoiler" data-solution="text">12150</span> | ||
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation">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 <code>operator<<</code> iz osnovne klase, koji preko reference na klasu A ispisuje vrednosti polja <code>a</code> 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.</span> | |||
== 10. zadatak == | == 10. zadatak == | ||
| Ред 158: | Ред 165: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Rešenje: <span class="spoiler" data-solution="text">34</span> | '''Rešenje:''' <span class="spoiler" data-solution="text">34</span> | ||
'''Objašnjenje:''' <span class="spoiler" data-solution="explanation">Hvatanje po referenci neće uhvatiti izuzetak tipa pokazivača na klasu <code>IzuzI</code>, 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.</span> | |||
[[Категорија:Рокови]] | [[Категорија:Рокови]] | ||
[[Категорија:ОО1]] | [[Категорија:ОО1]] | ||
Верзија на датум 11. децембар 2021. у 01:17
- За питања са више одговора, тачни одговори су подебљани и уоквирени
- За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
- Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:
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 const X*. 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.