ОО1/К2 2023

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

К2 2023. године одржан је 12. месеца и трајао је 20мин.

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


1. задатак

Које од следећих оператора је могуће преклопити за класне типове?

  1. () (оператор за позив функција)
  2. -> (оператор за посредан приступ члановима класе преко показивача)
  3. ?: (оператор за условни израз)
  4. :: (оператор за разрешење досега)
  5. . (оператор за приступ члану класе)

2. задатак

Шта исписује следећи програм на програмском језику C++?

Напомена 1: Унарна варијанта оператора * има виши приоритет у односу на бинарну

Напомена 2: Уколико смарате да се код не преводи, уписати НП. Уколико сматрате да се дешава грешка у извршавању уписати Г.

#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;
}

Одговор: 122 Објашњење: Дати израз се евалуира као: (*x) * (*y) * (**з). Само у *x случају се позива унарни * над цонст А&, а у осталим подизразима имамо преклопљен бинарни оператор * над две цонст А&

3. задатак

Шта важи за оператор = на језику C++?

  1. Уколико не постоји премештајућа варијанта оператора доделе (суспендована је и имплицитна премештајућа додела) у случају када је десни операнд нестајућа вредност (енг. еxпиринг валуе), користиће се постојећа копирајућа варијанта оператора доделе
  2. Уколико оператор није експлицитно дефинисан, на месту позива оператора ће се позвати конструктор копије
  3. Постоји копирајућа и премештајућа варијанта оператора =
  4. Оператор је могуће преклопити као нестатички метод класе
  5. Оператор је могуће преклопити као глобалну пријатељску функцију

4. задатак

Које од наведених особина су заједничке за преклапање оператора -> и префиксног ++ оператора?

  1. Преклапањем је моуће променити приоритет оператора
  2. Преклапају се као бинарни оператори
  3. Преклапају се као унарни оператори
  4. Морају да се преклопе као статички метод клсе
  5. Тип резултата мора бити једнак типу операнда

5. задатак

Које тврдње су тачне за програмски језик C++?

  1. Приликом конструкције објекта једноструко изведене класе прво се изврашава тело конструктора изведене класе
  2. Конструктор једноструко изведене класе који није делегирајући мора у листи иницијализатора имати иницијализатор основне класе уколико основна класа нема подразумевани конструктор
  3. Уколико основна класа има подразумевани конструктор, тада се никада неће извршавати ниједан конструктор основне класе приликом конструкције објекта изведене класе.
  4. Уколико основна класа има доступан подразумевани конструктор, тада је могуће дефинисати конструктор изведене класе са празном листом иницијализатора

6. задатак

Шта исписује дати програм на програмском језику 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();
}

Изаберите један одговор:

  1. 2
  2. Дати програм се не преводи
  3. 3
  4. 4

Објашњење: Када се позива конструктор класе А, њему се прослеђује копија вредност кк, па никакви бочни ефекти немају утицај на кк из конструктора Б. Затим се у телу конструктора Б к иницијализује на кк, чиме се гази било каква додела из конструктора А, јер к је заштићен члан па је доступан и у класи А и у класи Б

7. задатак

За дати код написанна програмском језику C++ одредити за које дефиниције метода м у класи Б ће се наведени програм исправно извршавати (бити без грешке у превођењу и извршавању, игнорисати цурење меморије)

#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;
}

Изаберите један или више одговора одговор:

  1. воид *м(А &а) оверриде {ретурн неw Б();}
  2. А *м(А &а) {ретурн неw Б();}
  3. Б *м(Б &б) оверриде {ретурн неw Б();}
  4. Б *м(А &а) оверриде {ретурн неw Б();}
  5. А *м(Б &б) {ретурн неw Б();}

Објашњење: Ако се ради надјачавање (оверриде) потпис метода мора бити идентичан осим повратне вредности, која ако је била показивач или референца на основну класу у основном методу, у надјачаном методу може бити референца или показивач на изведену класу. Ако нема кључне речи оверриде потпис може бити произвољан, јер ако није исти (или скоро исти, са горенаведеним изузетком) само ће се извршити преклапање имена.

8. задатак

Шта исписује следећи програм на програмском језику C++? Напомена: Уколико смарате да се код не преводи, уписати НП. Уколико сматрате да се дешава грешка у извршавању уписати Г.

#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;
}

Одговор: БЦ~Б Објашњење: Да би се позвао деструктор подкласе преко показивача типа надкласе, деструктор мора бити декларисан као виртуелан у надкласи

9. задатак

Шта исписује следећи програм на програмском језику 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';
}

Изаберите један одговор:

  1. ц
  2. д
  3. цд
  4. бцд
  5. баца се изузетак бад_цаст

Објашњење: Дyнамиц_цаст проверава тип показиваног (референцираног) објекта, занемарујући тип показивача (референце) и не дозвољава доwнцаст. Ако се доwнцаст покуша с показивачем вратиће нуллптр, а ако се покуша с референцом бациће бад_цаст изузетак. Нико живи не зна који ће им тyпеинфо.х

10. задатак

Којим редоследом се извршавају констр?уктори за класу која је изведена из више основних класа од којих су неке виртуелне основне класе? Редослед је одређен растућим бројевима. Прво се извршава 1, па 2...

  1. 1 Конструктори виртуелних основних класа
  2. 2 Конструктори невиртуелних основних класа
  3. 3 Конструктори атрибута изведене класе
  4. 4 Тело конструктора изведене класе