ОО1/Јануар 2022

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

Г1

1. задатак

Шта је тачно за наведени исечак кода на језику C++?

#include <iostream>

using namespace std;

int main() {
    int niz[] = { 1, 2, 3 };
    int i;
    cin >> i;
    cout << niz[i];
}
  1. Постоји проблем цурења меморије.
  2. Низ има тачно 3 елемента.
  3. Постоји проблем са висећим показивачем.
  4. Ако се на стандардни улаз упише 1, програм ће исписати 1.

2. задатак

Шта је могуће ставити уместо ??? на овом исечку кода на језику C++?

#include <iostream>
using namespace std;

int main() {
    char slova[] = "slova";
    char* const pk = slova;
    ???
}
  1. pk++;
  2. (*пк)++;
  3. pk = "xyz";
  4. цхар ц = пк[1];
  5. пк[0] = 'а';

Објашњење: pk је константни показивач на char што значи да не може да се промени на шта он показује, тако да су први и трећи одговори нетачни. Други и пети одговори су тачни јер је само показивач константан, а не променљива на коју показује.

3. задатак

Шта је могуће ставити уместо ??? на овом исечку кода на језику C++?

#include <iostream>
using namespace std;

class X {
    int a;
public:
    static int y;
    int b;
private:
    static int x;
};

int X::y = 1;
int X::x = 2;

int main() {
    X obj;
    ???
}
  1. obj.a = 5;
  2. обј.б = 5;
  3. обј.y = 5;
  4. obj.x = 5;
  5. X::y = 5;

4. задатак

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

#include <iostream>
using namespace std;

class X {
public:
    static X&& kreiraj() { X* pk = new X(); return static_cast<X&&>(*pk); }
    void metod()& { cout << 1; }
    void metod()&& { cout << 2; }
};

int main() {
    X x;
    x.metod();
    X::kreiraj().metod();
}
  1. Програм се не преводи.
  2. 1
  3. 11
  4. 12
  5. 21

5. задатак

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

#include <iostream>

using namespace std;

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

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

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

int main() {
    C c;
}
  1. Програм се не преводи.
  2. 0120
  3. 0102
  4. Ниједан од понуђених одговора.

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

6. задатак

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

  1. Ако се преклопи оператор new губи се подразумевани конструктор.
  2. Када се преклапа (), оператор може да прими произвољно параметара али сви морају да буду стандардног типа.
  3. Функцијска класа је класа која преклапа барем један од оператора () [] ->.
  4. Класа може имати више преклопљених new оператора.
  5. new оператор се преклапа као статички метод.

7. задатак

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

  1. Апстрактна класа је она која има барем једну апстрактну методу.
  2. Статички метод може да буде апстрактан.
  3. Класа може бити апстрактна ако су јој деструктор и све методе конкретне.
  4. Да би изведена класа била конкретна, мора да конкретизује све апстрактне методе.
  5. Апстрактна класа се означава са abstract у дефиницији пре class.

8. задатак

Шта је тачно од следећих навода о шаблонским класама на језику C++?

  1. Може се изводити из шаблонских класа.
  2. Шаблонска класа не може имати виртуелне методе.
  3. Шаблонски методи не могу бити виртуелни.
  4. ??
  5. ??

9. задатак

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

  1. Деструктор може да буде виртуелан.
  2. Конструктор може да буде виртуелан.
  3. Статички метод може да буде виртуелан.
  4. Пријатељска глобална функција може бити виртуелна.
  5. Нестатички метод може да буде виртуелан.

10. задатак

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

  1. Руковалац типа double може да прихвати изузетке типа int.
  2. Руковалац типа ... прихвата све типове изузетака.
  3. Руковалац типа int може да прихвати изузетке типа double.
  4. Изузетак може да се баци из try блока.
  5. Изузетак не може да се баци из catch блока.

Г3

1. задатак

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

#include <iostream>
using namespace std;

int i = 7;
int main() {
    for (int i = 0; i < 3; i++) {
        if (int i = 1) {
            cout << i;
        }
    }
    cout << i;
    return 0;
}

Одговор: 1117

Објашњење: Услов ће увек бити испуњен и локална променљива која се исписује у петљи ће увек бити 1. На крају свега тога, исписује се глобална променљива (локална променљива је изашла из досега).

2. задатак

Шта може да стоји уместо #### да би се код написан на језику C++ успешно превео?

#include <iostream>

int main() {
    int a = 1, b = 2;
    int * const p = &a;
    ####
}
  1. p++;
  2. *п = 1;
  3. p = &b;
  4. стд::цоут << п;
  5. стд::цоут << *п;

3. задатак

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

#include <iostream>
using namespace std;

class Klasa {
public:
    void metoda() & { cout << "1"; }
    void metoda() && { cout << "2"; }
};

int main(){
    Klasa &&dRef = Klasa();
    dRef.metoda();
    return 0;
}

Одговор: 1

Објашњење: Референца на двредност је лвредност.

4. задатак

Уколико су дате следеће датотеке "X.х" и "маин.цпп":

// datoteka X.h
class X {
    int a;
private:
    static int b;
public:
    static int c;
    int d;
};
// datoteka main.cpp
#include "X.h"

int X::b = 1;
int X::c = 1;

int main() {
    X y;
    ***
}

која од ових наведених наредби исправно замењује ***?

  1. y.b = 2;
  2. X::ц = 5;
  3. y.a = 1;
  4. X::d = 3;
  5. y.д = 4;

5. задатак

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

  1. Уколико је леви операнд бинарне операције стандардног типа мора се преклопити као метод одговарајуће класе.
  2. Оператор [] се мора преклопити као глобална пријатељска функција.
  3. Оператор доделе се мора преклопити као нестатички метод класе.
  4. Оператор () се мора преклопити као нестатички метод класе.
  5. Бинарни оператор + је могуће преклопити и као метод класе и као глобалну пријатељску функцију.

6. задатак

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

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

7. задатак

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

#include <iostream>
using namespace std;

class B {
public:
    B() { std::cout << "b"; }
};

class X : virtual public B {
public:
    X() { std::cout << "x"; }
};

class Y : virtual public B {
public:
    Y() { std::cout << "y"; }
};

class Z : public X, public Y {
public:
    Z() { std::cout << "z"; }
};

int main() {
    Z z;
}
  1. бxyз
  2. бxбyз
  3. бyxз
  4. бyбxз
  5. Програм се не преводи.

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

8. задатак

Које тврдње у вези оператора за динамичку конверзију (dynamic_cast) су тачне?

  1. Оператор за динамичку конверзију примењен на референцу типа основне класе при неуспешној конверзији у референцу на изведену класу баца изузетак типа bad_cast.
  2. Оператор за динамичку конверзију се мора примењивати за сваку конверзију навише (upcast) која се врши у време извршења програма.
  3. Оператор за динамичку конверзију се може применити на показивач или референцу на објекат неполиморфне основне класе.
  4. Оператор за динамичку конверзију примењен на показивач типа основне класе враћа nullptr ако конверзија у показивач типа изведене класе не успева.
  5. Оператор за динамичку конверзију гарантује да ће се конверзија у време извршења правилно извршити и да ће објекат бити конвертован у циљни објекат.

9. задатак

Ако су I1, I2, I3 и I4 класе изузетака и ако је у основној класи A декларисан метод:

virtual void m() throw (I1, I2, I3);

декларација метода m() у изведеној класи B може да буде:

  1. воид м() ноеxцепт;
  2. воид м() тхроw ();
  3. воид м() тхроw (И1, И2, И3);
  4. воид м() тхроw (И1);
  5. воид м() тхроw (И2, И4);

10. задатак

Ако је генеричка класа дефинисана на следећи начин:

template <class T> class K { void m(T t); };

метод m може да буде дефинисан изван класе K на следећи начин:

  1. воид К::м(Т т) { ... }
  2. темплате <цласс Т> воид К<Т>::м(Т т) { ... }
  3. воид К<Т>::м(Т т) { ... }