ОО1/К2 2023 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
мНема описа измене
 
(Није приказано 10 међуизмена 2 корисника)
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
'''Neki rok 2023. godine''' održan je 12. meseca i trajao je 20min.
'''K2 2023. godine''' održan je 12. meseca i trajao je 20min.
{{rešenja}}
{{rešenja}}


Ред 9: Ред 9:
Koje od sledećih operatora je moguće preklopiti za klasne tipove?
Koje od sledećih operatora je moguće preklopiti za klasne tipove?
<div class="abc-list" data-solution="multiple">
<div class="abc-list" data-solution="multiple">
# <span class="solution">'''()''' (operator za poziv funkcija)</span>
# <span class="solution"><code>()</code> (operator za poziv funkcija)</span>
# <span class="solution">'''->''' (operator za posredan pristup članovima klase preko pokazivača)</span>
# <span class="solution"><code>-></code> (operator za posredan pristup članovima klase preko pokazivača)</span>
# '''?:''' (operator za uslovni izraz)
# <code>?:</code> (operator za uslovni izraz)
# '''::''' (operator za razrešenje dosea)
# <code>::</code> (operator za razrešenje dosega)
# '''.''' (operator za pristup članu klase)
# <code>.</code> (operator za pristup članu klase)
</div>
</div>


Ред 27: Ред 27:
class A {
class A {
public:
public:
     friend const A& operator *(const A& a) {
     friend const A &operator*(const A &a) {
         cout << "1";
         cout << "1";
         return a;
         return a;
     }
     }
     friend const A& operator*(const A &a1, const A& a2) {
     friend const A &operator*(const A &a1, const A &a2) {
         cout << "2";
         cout << "2";
         return a1;
         return a1;
Ред 41: Ред 41:
     A **z = &y;
     A **z = &y;
     *x**y***z;
     *x**y***z;
    return 0;
}
}
</syntaxhighlight>
</syntaxhighlight>
Ред 50: Ред 49:
Šta važi za operator = na jeziku C++?
Šta važi za operator = na jeziku C++?
<div class="abc-list" data-solution="multiple">
<div class="abc-list" data-solution="multiple">
# <span class="solution">Ukoliko ne postoji premeštajuća varijanta operatora dodela (suspendovana je i implicitna premeštajuća dodela) u slučaju kada je desni operand nestajuća vrednost (eng. ''expiring value''), koristiće se postojeća kopirajuća varijanta operatora dodele</span>
# <span class="solution">Ukoliko ne postoji premeštajuća varijanta operatora dodele (suspendovana je i implicitna premeštajuća dodela) u slučaju kada je desni operand nestajuća vrednost (eng. ''expiring value''), koristiće se postojeća kopirajuća varijanta operatora dodele</span>
# Ukoliko operator nije eksplicitno definisan, na mestu poziva operatora će se pozvati konstruktor kopije
# Ukoliko operator nije eksplicitno definisan, na mestu poziva operatora će se pozvati konstruktor kopije
# <span class="solution">Postoji kopirajuća i premeštajuća varijanta operatora =</span>
# <span class="solution">Postoji kopirajuća i premeštajuća varijanta operatora =</span>
Ред 129: Ред 128:
Izaberite jedan ili više odgovora odgovor:
Izaberite jedan ili više odgovora odgovor:
<div class="abc-list" data-solution="multiple">
<div class="abc-list" data-solution="multiple">
# void *m(A &a) override {return new B();}
# <syntaxhighlight inline lang="cpp">void *m(A &a) override {return new B();}</syntaxhighlight>
# <span class="solution">A *m(A &a) {return new B();}</span>
# <syntaxhighlight inline lang="cpp" class="solution">A *m(A &a) {return new B();}</syntaxhighlight>
# B *m(B &b) override {return new B();}
# <syntaxhighlight inline lang="cpp">B *m(B &b) override {return new B();}</syntaxhighlight>
# <span class="solution">B *m(A &a) override {return new B();}</span>
# <syntaxhighlight inline lang="cpp" class="solution">B *m(A &a) override {return new B();}</syntaxhighlight>
# <span class="solution">A *m(B &b) {return new B();}</span>
# <syntaxhighlight inline lang="cpp" class="solution">A *m(B &b) {return new B();}</syntaxhighlight>
</div>
</div>
Objašnjenje: <span class="spoiler" data-solution="explanation">Ako se radi nadjačavanje (override) potpis metoda mora biti identilan osim povratne vrednosti, koja ako je bila pokazivаč ili referenca na osnovnu klasu u osnovnom metodu, u nadjačanom metodu može biti referenca ili pokazivač na izvedenu klasu u nadjačanoj metodi. Ako nema ključne reči override potpis može biti proizvoljan, jer ako nije isti samo će se izvršiti preklapanje imena.</span>
Objašnjenje: <span class="spoiler" data-solution="explanation">Ako se radi nadjačavanje (override) potpis metoda mora biti identičan osim povratne vrednosti, koja ako je bila pokazivаč ili referenca na osnovnu klasu u osnovnom metodu, u nadjačanom metodu može biti referenca ili pokazivač na izvedenu klasu. Ako nema ključne reči override potpis može biti proizvoljan, jer ako nije isti (ili skoro isti, sa gorenavedenim izuzetkom) samo će se izvršiti preklapanje imena.</span>


== 8. zadatak ==
== 8. zadatak ==
Ред 190: Ред 189:
# baca se izuzetak bad_cast
# baca se izuzetak bad_cast
</div>
</div>
Objašnjenje: <span class="spoiler" data-solution="explanation">Dynamic_cast proverava tip pokazivanog (referenciranog) objekta, zanemarujući tip pokazivača (reference) i ne dozvoljava downcast. Ako se downcast pokuša s pokazivaćem vratiće nullptr, a ako se pokuša s referencom baciće bad_cast izuzetak. Niko živi ne zna koji će im typeinfo.h</span>
Objašnjenje: <span class="spoiler" data-solution="explanation">Dynamic_cast proverava tip pokazivanog (referenciranog) objekta, zanemarujući tip pokazivača (reference) i ne dozvoljava downcast. Ako se downcast pokuša s pokazivačem vratiće nullptr, a ako se pokuša s referencom baciće bad_cast izuzetak. Niko živi ne zna koji će im typeinfo.h</span>


== 10. zadatak ==
== 10. zadatak ==
Kojim redosledom se izvršavaju konstr?uktori za klasu koja je izvedena iz više osnovnih klasa od kojih su neke virtuelne osnovne klase? Redosled je određen rastućim brojevima. Prvo se izvršava 1, pa 2...
Kojim redosledom se izvršavaju konstr?uktori za klasu koja je izvedena iz više osnovnih klasa od kojih su neke virtuelne osnovne klase? Redosled je određen rastućim brojevima. Prvo se izvršava 1, pa 2...
<div class="abc-list" data-solution="select" data-options="Konstruktori nevirtuelnih osnovnih klasa, Telo konstruktora izvedene klase, Konstruktori atributa izvedene klase, Konstruktori virtuelnih osnovnih klasa">
<div class="abc-list" data-solution="select" data-options=" , Konstruktori nevirtuelnih osnovnih klasa, Telo konstruktora izvedene klase, Konstruktori atributa izvedene klase, Konstruktori virtuelnih osnovnih klasa">
# 1 <span class="spoiler">Konstruktori virtuelnih osnovnih klasa</span>
# 1 <span class="spoiler">Konstruktori virtuelnih osnovnih klasa</span>
# 2 <span class="spoiler">Konstruktori nevirtuelnih osnovnih klasa</span>
# 2 <span class="spoiler">Konstruktori nevirtuelnih osnovnih klasa</span>
Ред 202: Ред 201:


[[Категорија:Рокови]]
[[Категорија:Рокови]]
[[Категорија:ОO1]]<!-- Zameniti sa nazivom predmeta -->
[[Категорија:ОО1]]

Тренутна верзија на датум 28. април 2024. у 21:28

K2 2023. godine održan je 12. meseca i trajao je 20min.

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


1. zadatak

Koje od sledećih operatora je moguće preklopiti za klasne tipove?

  1. () (operator za poziv funkcija)
  2. -> (operator za posredan pristup članovima klase preko pokazivača)
  3. ?: (operator za uslovni izraz)
  4. :: (operator za razrešenje dosega)
  5. . (operator za pristup članu klase)

2. zadatak

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

Napomena 1: Unarna varijanta operatora * ima viši prioritet u odnosu na binarnu

Napomena 2: Ukoliko smarate da se kod ne prevodi, upisati NP. Ukoliko smatrate da se dešava greška u izvršavanju upisati G.

#include <iostream>
using namespace std;
class A {
public:
    friend const A &operator*(const A &a) {
        cout << "1";
        return a;
    }
    friend const A &operator*(const A &a1, const A &a2) {
        cout << "2";
        return a1;
    }
};
int main() {
    A x;
    A *y = &x;
    A **z = &y;
    *x**y***z;
}

Odgovor: 122 Objašnjenje: Dati izraz se evaluira kao: (*x) * (*y) * (**z). Samo u *x slučaju se poziva unarni * nad const A&, a u ostalim podizrazima imamo preklopljen binarni operator * nad dve const A&

3. zadatak

Šta važi za operator = na jeziku C++?

  1. Ukoliko ne postoji premeštajuća varijanta operatora dodele (suspendovana je i implicitna premeštajuća dodela) u slučaju kada je desni operand nestajuća vrednost (eng. expiring value), koristiće se postojeća kopirajuća varijanta operatora dodele
  2. Ukoliko operator nije eksplicitno definisan, na mestu poziva operatora će se pozvati konstruktor kopije
  3. Postoji kopirajuća i premeštajuća varijanta operatora =
  4. Operator je moguće preklopiti kao nestatički metod klase
  5. Operator je moguće preklopiti kao globalnu prijateljsku funkciju

4. zadatak

Koje od navedenih osobina su zajedničke za preklapanje operatora -> i prefiksnog ++ operatora?

  1. Preklapanjem je mouće promeniti prioritet operatora
  2. Preklapaju se kao binarni operatori
  3. Preklapaju se kao unarni operatori
  4. Moraju da se preklope kao statički metod klse
  5. Tip rezultata mora biti jednak tipu operanda

5. zadatak

Koje tvrdnje su tačne za programski jezik C++?

  1. Prilikom konstrukcije objekta jednostruko izvedene klase prvo se izvrašava telo konstruktora izvedene klase
  2. Konstruktor jednostruko izvedene klase koji nije delegirajući mora u listi inicijalizatora imati inicijalizator osnovne klase ukoliko osnovna klasa nema podrazumevani konstruktor
  3. Ukoliko osnovna klasa ima podrazumevani konstruktor, tada se nikada neće izvršavati nijedan konstruktor osnovne klase prilikom konstrukcije objekta izvedene klase.
  4. Ukoliko osnovna klasa ima dostupan podrazumevani konstruktor, tada je moguće definisati konstruktor izvedene klase sa praznom listom inicijalizatora

6. zadatak

Šta ispisuje dati program na programskom jeziku C++?

#include <iostream>
using namespace std;
class A {
protected:
    int k;
public:
    A(int kk) : k(kk++) {
        k = ++kk;
    }
};
class B : public A {
public:
    B(int kk) : A(kk) { k = kk; }
    int dohvatiK() { return k; }
};
int main() {
    B b(2);
    cout << b.dohvatiK();
}

Izaberite jedan odgovor:

  1. 2
  2. Dati program se ne prevodi
  3. 3
  4. 4

Objašnjenje: Kada se poziva konstruktor klase A, njemu se prosleđuje kopija vrednost kk, pa nikakvi bočni efekti nemaju uticaj na kk iz konstruktora B. Zatim se u telu konstruktora B k inicijalizuje na kk, čime se gazi bilo kakva dodela iz konstruktora A, jer k je zaštićen član pa je dostupan i u klasi A i u klasi B

7. zadatak

Za dati kod napisanna programskom jeziku C++ odrediti za koje definicije metoda m u klasi B će se navedeni program ispravno izvršavati (biti bez greške u prevođenju i izvršavanju, ignorisati curenje memorije)

#include <iostream>
using namespace std;
class A {
public:
    virtual A* m(A& a) {return new A();}
};
class B : public A {
public:
    // ovde nedostaje definicija metoda m
};
int main() {
    B b;
    b.m(b);
    return 0;
}

Izaberite jedan ili više odgovora odgovor:

  1. void *m(A &a) override {return new B();}
  2. A *m(A &a) {return new B();}
  3. B *m(B &b) override {return new B();}
  4. B *m(A &a) override {return new B();}
  5. A *m(B &b) {return new B();}

Objašnjenje: Ako se radi nadjačavanje (override) potpis metoda mora biti identičan osim povratne vrednosti, koja ako je bila pokazivаč ili referenca na osnovnu klasu u osnovnom metodu, u nadjačanom metodu može biti referenca ili pokazivač na izvedenu klasu. Ako nema ključne reči override potpis može biti proizvoljan, jer ako nije isti (ili skoro isti, sa gorenavedenim izuzetkom) samo će se izvršiti preklapanje imena.

8. zadatak

Šta ispisuje sledeći program na programskom jeziku C++? Napomena: Ukoliko smarate da se kod ne prevodi, upisati NP. Ukoliko smatrate da se dešava greška u izvršavanju upisati G.

#include <iostream>
using namespace std;
class B {
public:
    B() { cout << "B"; }
    ~B() { cout << "~B"; }
};
class C : public B {
public:
    C() { cout << "C"; }
    ~C() { cout << "~C"; }
};
int main() {
    B *b = new C();
    delete b;
    return 0;
}

Odgovor: BC~B Objašnjenje: Da bi se pozvao destruktor podklase preko pokazivača tipa nadklase, destruktor mora biti deklarisan kao virtuelan u nadklasi

9. zadatak

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

#include <iostream>
#include <typeinfo.h>
using namespace std;
class A {public: virtual void m() {}};
class B : public A {};
class C : public B {};
int main() {
    A *pa = new B();
    B *pb = new C();
    B *b = dynamic_cast<B *>(pa);
    C *c = dynamic_cast<C *>(pa);
    C *d = dynamic_cast<C *>(pb);
    if (b == nullptr) cout << 'b';
    if (c == nullptr) cout << 'c';
    if (d == nullptr) cout << 'd';
}

Izaberite jedan odgovor:

  1. c
  2. d
  3. cd
  4. bcd
  5. baca se izuzetak bad_cast

Objašnjenje: Dynamic_cast proverava tip pokazivanog (referenciranog) objekta, zanemarujući tip pokazivača (reference) i ne dozvoljava downcast. Ako se downcast pokuša s pokazivačem vratiće nullptr, a ako se pokuša s referencom baciće bad_cast izuzetak. Niko živi ne zna koji će im typeinfo.h

10. zadatak

Kojim redosledom se izvršavaju konstr?uktori za klasu koja je izvedena iz više osnovnih klasa od kojih su neke virtuelne osnovne klase? Redosled je određen rastućim brojevima. Prvo se izvršava 1, pa 2...

  1. 1 Konstruktori virtuelnih osnovnih klasa
  2. 2 Konstruktori nevirtuelnih osnovnih klasa
  3. 3 Konstruktori atributa izvedene klase
  4. 4 Telo konstruktora izvedene klase