ОО1/Фебруар 2021

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

1. задатак

Која од наведених дефиниција најбоље одговара апстракцији као елементну објектно оријентисаног стила програмирања?

  1. Одвајање интерфејса класе од њене имплементације која се сакрива од корисника.
  2. Препознавање битних својстава скупова сличних објеката и описивање заједничком класом.
  3. Могућност креирања апстрактних класа и функција чланица.
  4. Приступачност одређеним члановима класе навођењем права приступа.

2. задатак

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

const int j = 1;
const auto k = j;
auto i = new int + k;
  1. цонст инт*
  2. инт*
  3. инт
  4. цонст инт* цонст
  5. цонст инт
  6. инт *цонст

Објашњење: Тип променљиве k ће бити const int, јер јој се само додељује j, али ће тип i бити int* јер оператор new враћа показивач који није константан и на њега се само додаје померај k.

3. задатак

У класи X је дефинисан метод m.

class X {
public:
	void m(X *x) const {}
};

Ког типа је показивач this у методу m?

  1. цонст X * цонст
  2. X*
  3. X * цонст
  4. X
  5. цонст X *

Објашњење: Показивач this не може да се мења, па је подразумевано типа X* const. Када се дода const модификатор на методу m, то значи да поља објекта не могу да се мењају унутар методе и зато тај показивач постаје const X* const.

4. задатак

Који од следећих тврђења су тачни за статичке методе класе X:

  1. Немају показивач this
  2. Имају право приступа свим члановима X
  3. Имају јавно право приступа независно од секције у којој се налазе
  4. Могу да приступају статичким атрибутима и функцијама простим именовањем
  5. Морају се дефинисати ван тела класе

5. задатак

Шта исписује следећи програм на програмском језику C++? (Уколико сматрате да се програм не преводи, унесите НП. Уколико сматрате да долази до грешке при извршавању, унесите 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;
}

Решење: 133

Објашњење: Показивач pk ће на почетку показивати на почетак низа brojevi, затим бити увећан за 1 па ће показивати на други елемент низа. Референца ref од стварања показује на исти елемент као pk, али се применом оператора ++ над референцом не мења њена локација (јер се она не може променити) него вредност члана низа на који показује, па ће у низу бити бројеви 1, 3 и 3 који се испод и исписују.

6. задатак

Ког типа је параметар премештајућег оператора доделе за класу X?

Решење: X&&

7. задатак

Који од понуђених префикса опште (неспецијализоване) шаблонске (генреичке[сиц]) функције или класе су исправни?

  1. темплате<тyпенаме Т>
  2. темплате<тyпенаме Т, инт Н>
  3. темплате<инт Н>
  4. темплате<тyпенаме Т, тyпенаме У>
  5. темплате<>

Објашњење: template<> се може користити само за специјализације шаблона.

8. задатак

На које све начине је могуће дефинисати класу Б изведену из класе А?

  1. цласс Б : виртуал А {...};
  2. цласс Б : протецтед публиц А {...};
  3. цласс Б : оверриде А {...};
  4. цласс Б : А {...};
  5. цласс Б : публиц А {...};

9. задатак

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

Решење: 12150

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

10. задатак

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

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

Решење: 34

Објашњење: Хватање по референци неће ухватити изузетак типа показивача на класу IzuzI, па се позива општи руковаоц грешкама који исписује 3 и поново баца грешку. Након тога, први следећи руковаоц ће ухватити грешку јер је грешка показивачког типа на тип који може стандардно да се конвертује у показивачки тип руковаоца и исписаће 4.