ОО1/Пробни тестови 2020

Извор: SI Wiki
< ОО1
Датум измене: 31. јануар 2022. у 20:01; аутор: KockaAdmiralac (разговор | доприноси) (Objašenjenja pitalica)
Пређи на навигацију Пређи на претрагу
  • За питања са више одговора, тачни одговори су подебљани и уоквирени
  • За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
  • Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:

Први тест

На сваком питању је било или могуће изабрати једно или више решења или унети одговор у поље.

1. задатак

Приликом реупотребе објектно оријентисаног кода извођењем, у начелу се стари код (постојећа класа - основа за извођење):

  1. не мора мењати ни поново преводити и тестирати.
  2. не мора мењати, али се мора поново преводити и тестирати.
  3. не мора мењати, мора поново преводити, али се не мора поново тестирати.
  4. мора мењати и поново преводити и тестирати.
  5. уопште не може искористити.

2. задатак

Која наредба омогућава коришћење имена X из простора имена Y простим именовањем X, уколико не постоји конфликт имена?

  1. decltype Y;
  2. using namespace Y;
  3. using Y::X;
  4. namespace Y.X;
  5. using Y;

3. задатак

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

#include <iostream>
struct S1{
  int a;
  int b;
};

struct S2{
  S1 a;
  int b[3][2];
};

int main() {
  S2 s={1,2,{{3},{},{4,5}}};
  std::cout<<s.b[2][0];
}

Одговор: 4

Објашњење: 1 и 2 одговарају пољима а и б структуре С1. {{3},{},{4,5}} представља иницијализацију низа, проширено представљену као {{3, 0}, {0, 0}, {4, 5}}. На крају се из трећег низа из поља б ({4, 5}) исписује први елемент.

4. задатак

Шта је дозвољено да стоји на месту наредбе ###?

#include <iostream>
struct A{
    A(){}; //podrazumevani konstruktor strukture A
    int x;
    const int y=1;
    mutable int z;
};

int main(){
    A a1;
    const A a2;
    ###
}
  1. а2.з=1;
  2. a1.y=1;
  3. a2.y=1;
  4. а1.x=1;
  5. а1.з=1;
  6. a2.x=1;

5. задатак

Које функције су исправне, јер враћају референцу на "жив" објекат?

  1. int& f(int &i){int r=i; return r; }
  2. int& f(int i){return i; }
  3. инт& ф(инт &и){ретурн *неw инт(и); }
  4. инт& ф(инт &и){инт &р=*неw инт(и); ретурн р; }
  5. инт& ф(инт &и){ретурн и; }
  6. int& f(int &i){int r=*new int(i); return r; }

Објашњење: Прва функција враћа референцу на локалну променљиву у коју је копирана вредност. Друга функција исто, али се копирање дешава при прослеђивању аргумената. Шеста функција алоцира објекат на хипу, али онда његову вредност копира у локалну променљиву па враћа референцу на ту променљиву.

6. задатак

Који од следећих исказа су тачни на језику C++?

  1. Класа може имати више приватних секција.
  2. Из метода позваног за неки објекат се не може приступити приватном атрибуту другог објекта исте класе.
  3. Јавној секцији класе могу приступати само јавни методи класе, а приватној секцији само приватни методи.
  4. Члановима у приватној секцији класе може приступати само јавни метод исте класе.
  5. Подразумевана секција класе је јавна.

7. задатак

За непроменљив и непостојан (const volatile) објекат класе могу да се позивају методи те класе са наведеним следећим модификаторима (који одређују природу текућег објекта):

  1. inline
  2. const
  3. volatile
  4. цонст волатиле
  5. без модификатора

8. задатак

Нека је дата дефиниција класе Тест

class Test{
    Test(){}
};

За које од следећих линија кода у функцији маин() ће преводилац пријавити грешку?

  1. Тест тест;
  2. Тест* тест = неw Тест();
  3. Test test();
  4. Test* test;
  5. Тест тест{};

Објашњење: Подразумевани конструктор се налази у приватној секцији. Опција под ц је декларација методе а опција под д не прави објекат уопште.

9. задатак

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

#include <iostream>
using namespace std;

class A {
public:
    A() { cout << "A"; }
    A(int a) { cout << "A" << a; }
};

class B {
    A a;
public:
    B() { cout << "B"; }
    B(int b) { cout << "B" << b; }
};

class C {
    B b;
    A a;
public:
    C() { cout << "C"; }
    C(int c) : a(c) { cout << "C" << c; }
};

int main() {
    C c(1);
    return 0;
}

Одговор: АБА1Ц1

Објашњење: Иницијализује се класа C конструктором са једним аргументом. Одатле креће иницијализација њеног атрибута типа Б, када се позива подразумевани конструктор. Б садржи објекат класе А, па се подразумеваним конструктором иницијализује А и исписује А. Тада је готова иницијализација атрибута класе Б и иницијализација Б се завршава исписивањем Б. Затим се прелази на иницијализацију атрибута типа А класе C, али конструктором са једним аргументом јер тако пише у иницијализационој листи, па се исписује А1. На крају се исписује Ц1.

10. задатак

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

class A {
   int i;
public:
   A(int ii=2) { i = ii; }
};
  1. Класа А има конверзиони конструктор.
  2. Класа А има један конструктор.
  3. Објекат класе А се може створити позивањем конструктора који нема ниједан параметар.
  4. Објекат класе А се може створити позивањем конструктора који има један аргумент.
  5. Класа А нема подразумевани конструктор.

Други тест

1. задатак

Исти задатак се нашао и на пробном колоквијуму за ИР.

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

  1. operator()
  2. operator[]
  3. operator<<
  4. operator=
  5. operator+

2. задатак

Исти задатак се нашао и на пробном колоквијуму за ИР.

Повезати операторе са одговарајућом типичном применом:

  1. Рачунање вредности полинома у тачки оператор()
  2. Паметни показивач оператор->
  3. Асоцијативни приступ елементу збирке оператор[]

3. задатак

Исти задатак се нашао и на пробном колоквијуму за ИР.

Шта исписује следећи програм на програмском језику C++? Уколико се програм не преводи у поље за одговор треба уписати вредност 0.

#include <iostream>

class B;

class A {
public: 
    A(int i) {}
    A(const B &b) { std::cout << "1"; }
    A& operator=(const A& a) { std::cout << "2"; return *this; }
};

class B {
public: 
    operator A() { std::cout << "3"; return 1; }
};

int main() {
    B b;
    A a(1);
    a = b;
}

Одговор: 32

Објашњење: Оператор = класе А прима аргумент типа А, па мора да се деси конверзија из Б у А. Овде изгледа као да је конверзија двозначна, јер може да се изврши и преко конверзиононг конструктора класе А, и преко оператора конверзије класе Б, али није. Наиме, конверзиони конструктор класе А прима аргумент који има const квалификатор, док оператор конверзије нема const спецификатор, па конверзија иде преко оператора конверзије и исписује се 3. Након тога се изврши оператор доделе и испише 2.

4. задатак

Које тврдње су тачне?

  1. Оператор delete може имати произвољан број аргумената.
  2. У преклопљеном оператору new треба, као последњу наредбу, написати експлицитан позив конструктора класе за коју се оператор преклапа.
  3. Класа може имати више преклопљених delete оператора за појединачне објекте.
  4. Оператори new и delete се преклапају као статички методи класе.
  5. Класа може имати више преклопљених оператора new за низове.

5. задатак

Која од следећих тврдњи у вези извођења класа су тачна у језику C++?

  1. Из класе означене модификатором final није могуће даље извођење.
  2. Дозвољено је следеће извођење:
    class A : B { };
    class B : A { };
    
  3. Подразумеван начин извођења је заштићен (protected).
  4. Изведена класа не наслеђује конструкторе, деструктор и операторе operator= из основне класе.
  5. Извођење може бити јавно (public), заштићено (protected) или приватно (private).

6. задатак

Који искази су тачни? Изаберите један одговор:

  1. Приватним извођењем успоставља се релација садржања између објекта изведене класе и наслеђеног подобјекта основне класе.
  2. Објекат заштићено изведене класе је једна врста објекта основне класе у свакој глобалној функцији.
  3. Објекат јавно изведене класе наслеђује само имплементацију основне класе, не и уговор.
  4. Код приватног извођења наслеђује се уговор основне класе.
  5. Јавним извођењем се само успоставља релација садржања између објекта изведене класе и наслеђеног подобјекта основне класе.

7. задатак

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

#include <iostream>
using namespace std;

class A {
public:
    A() { cout << "A"; }
};

class C {
public:
    C() { cout << "C"; }
};

class B: public A {
    C c; A a;
public:
    B():c(), A(), a() { cout << "B"; }
};

int main() {
    B b[2];
}
  1. ЦААБЦААБ
  2. АЦБАЦБ
  3. ААЦБААЦБ
  4. АЦАБАЦАБ

Објашњење: Прво се иницијализује подобјекат А, а затим атрибути типа C а затим А, и на крају се позива конструктор Б. Редослед у иницијализаторској листи није битан. Пошто се праве два објекта у низу, исписује се два пута.

8. задатак

Шта исписује следећи програмски код:

#include <iostream>
using namespace std;

class O {
public:
    virtual void m() { cout << "1"; }
};

class I : public O {
public:
    virtual void m() override { cout << "2"; }
};

int main() {
    O * p = new I();
    O o = *p;
    
    p->m();
    (*p).m();
    o.m();
    
    return 0;
}

Одговор: 221

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

9. задатак

Шта треба да стоји уместо *** да би дати програм на језику C++ исписао БА? Изаберите један или више одговора.

#include <iostream>
using namespace std;

class A {
public:
    ***
};
class B: public A {
public:
    ~B() { cout << "B"; }
};
int main() {
    A *a = new B();
    delete a;
}
  1. ~А() { цоут << "А"; }
  2. ~А() { цоут << "БА"; }
  3. виртуал ~А() { цоут << "БА"; }
  4. виртуал ~А() { цоут << "А"; }

Објашњење: Уколико је деструктор виртуелан, позваће се деструктор и основне класе. Валидна алтернатива јесте да невиртуелни деструктор само испише тражени текст.

10. задатак

Које тврдње су тачне?

  1. Вишеструким извођењем се сматра извођење из више класа које нису у узајамном односу извођења (наслеђивања).
  2. Вишеструким извођењем се сматра извођење у којем је једна класа родитељ већег броја класа.
  3. Вишеструким извођењем се сматра извођење из већ изведене класе.
  4. Вишеструким извођењем се сматра извођење из класе из које су већ изведене неке друге класе.
  5. Вишеструким извођењем се наслеђују уговори и имплементације свих родитељских класа.

ИР колоквијум

1. задатак

Простор на стеку се додељује:

  1. Локалним статичким објектима
  2. Глобалним статичким објектима
  3. Аргументима (параметрима) функција
  4. Динамичким објектима
  5. Локалним аутоматским објектима

2. задатак

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

#include <iostream>
int& f(int &x) {
    return ++x;
}
int main() {
    int x = 1;
    int z = 1;
    auto y = f(z);
    y++;
    std::cout << x << y << z;
}
  1. 133
  2. 233
  3. Програмски код се не преводи.
  4. 132
  5. 232

Објашњење: auto, за разлику од decltype не задржава да ли је тип био референца или показивач, па је тип y само int и промена над y се не осликава над z.

3. задатак

Које тврђење је тачно?

  1. Механизам преклапање[сиц] имена функција је потпуно статички, која функција ће се позвати одређује се у време превођења.
  2. Механизам преклапање[сиц] имена функција је потпуно динамички, која функција ће се позвати одређује се у време извршавања.
  3. Механизам преклапање[сиц] имена функција је потпуно статички, која функција ће се позвати одређује се у време извршавања.
  4. Механизам преклапање[сиц] имена функција је потпуно динамички, која функција ће се позвати одређује се у време превођења.

4. задатак

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

  1. Методи int f() & { return 1; } и int f() && { return 3; } могу постојати у истој класи.
  2. Методи int f() & { return 1; } и int f() const & { return 3; } могу постојати у истој класи.
  3. Методи int f() & { return 1; } и void f() & { } могу постојати у истој класи.

5. задатак

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

#include <iostream>
using namespace std;

class A
{
private:
    int b = 2;
    int c = 3;
public:
    A() : c(b+1), b(7) { b--; a = 2; }
    void pisi() { cout << a << b << c; }
private:
    int a = 1;
};

int main()
{
    A obj;
    obj.pisi();
    return 0;
}

Одговор: 268

Објашњење: При иницијализацији објекта класе А поља б, ц и а се прво иницијализују на 7 (из конструктора), 8 (7+1) и 1, а затим се у конструктору б смањи на 6 а а постави на 2.

6. задатак

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

#include <iostream>
using namespace std;

class A {
    static int stID;
    int ID = ++stID;
public:
    A() {}
    A(const A& a) {}
    A(A&& a) {}
    ~A() { cout << ID; }
};

int A::stID = 0;

void f1(A& a) {}
void f2(A a) {}

int main() {
    A x;
    for(int i = 0; i < 3; i++){
        A* y = new A;
        if (i == 1) f2(*y);
        if (i == 2) f1(*y);
    }
    return 0;
}

Одговор: 41

Објашњење: Ствара се објекат x, са ИД од 1. У првој итерацији петље се само ствара објекат y са ИД од 2. У другој итерацији петље се поново ствара објекат y са ИД од 3, али се прослеђује методи у којој се копира и добија ИД од 4. На крају те методе се уништава и исписује 4. У трећој итерацији петље се поново ствара објекат y са ИД од 5, па се прослеђује методи у којој се не копира. На крају програма се уништава објекат x и исписује 1. Динамички алоцирани објекти нису експлицитно ослобођени, па њихови деструктори нису позвани и меморију коју они заузимају ће ослободити оперативни систем.

7. задатак

Која су тврђења тачна за пријатељске (friend) функције и класе?

  1. Ако је класа A пријатељ класе B и класа B пријатељ класе C, онда је и класа A пријатељ класе C.
  2. Функција m() која је пријатељ класи A може бити глобална функција.
  3. Ако класа A прогласи класу B за пријатеља, методи класе A имају приступ до приватних поља класе B
  4. Пријатељство између класа је симетрична релација.
  5. Функција m() која је пријатељ класи A може бити метод класе B.

8. задатак

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

  1. оператор[]
  2. оператор=
  3. оператор()
  4. operator+
  5. operator<<

9. задатак

Повезати операторе са одговарајућом типичном применом:

  1. Рачунање вредности полинома у тачки оператор()
  2. Паметни показивач оператор->
  3. Асоцијативни приступ елементу збирке оператор[]

10. задатак

Шта исписује следећи програм на програмском језику C++? Уколико се програм не преводи у поље за одговор треба уписати вредност 0.

#include <iostream>

class B;

class A {
public: 
    A(int i) {}
    A(const B &b) { std::cout << "1"; }
    A& operator=(const A& a) { std::cout << "2"; return *this; }
};

class B {
public: 
    operator A() { std::cout << "3"; return 1; }
};

int main() {
    B b;
    A a(1);
    a = b;
}

Одговор: 32

Објашњење: Оператор = класе А прима аргумент типа А, па мора да се деси конверзија из Б у А. Овде изгледа као да је конверзија двозначна, јер може да се изврши и преко конверзиононг конструктора класе А, и преко оператора конверзије класе Б, али није. Наиме, конверзиони конструктор класе А прима аргумент који има const квалификатор, док оператор конверзије нема const спецификатор, па конверзија иде преко оператора конверзије и исписује се 3. Након тога се изврши оператор доделе и испише 2.