ОО1/Фебруар 2021
- За питања са више одговора, тачни одговори су подебљани и уоквирени
- За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
- Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:
1. задатак
Која од наведених дефиниција најбоље одговара апстракцији као елементну објектно оријентисаног стила програмирања?
- Одвајање интерфејса класе од њене имплементације која се сакрива од корисника.
- Препознавање битних својстава скупова сличних објеката и описивање заједничком класом.
- Могућност креирања апстрактних класа и функција чланица.
- Приступачност одређеним члановима класе навођењем права приступа.
2. задатак
Који је тип променљиве i у следећем исечку кода написаном на језику C++?
const int j = 1;
const auto k = j;
auto i = new int + k;
цонст инт*инт*интцонст инт* цонстцонст интинт *цонст
Објашњење: Тип променљиве k ће бити const int, јер јој се само додељује j, али ће тип i бити int* јер оператор new враћа показивач који није константан и на њега се само додаје померај k.
3. задатак
У класи X је дефинисан метод m.
class X {
public:
void m(X *x) const {}
};
Ког типа је показивач this у методу m?
цонст X * цонстX*X * цонстXцонст X *
Објашњење: Показивач this не може да се мења, па је подразумевано типа X* const. Када се дода const модификатор на методу m, то значи да поља објекта не могу да се мењају унутар методе и зато тај показивач постаје const X* const.
4. задатак
Који од следећих тврђења су тачни за статичке методе класе X:
- Немају показивач
this - Имају право приступа свим члановима X
- Имају јавно право приступа независно од секције у којој се налазе
- Могу да приступају статичким атрибутима и функцијама простим именовањем
- Морају се дефинисати ван тела класе
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. задатак
Који од понуђених префикса опште (неспецијализоване) шаблонске (генреичке[сиц]) функције или класе су исправни?
темплате<тyпенаме Т>темплате<тyпенаме Т, инт Н>темплате<инт Н>темплате<тyпенаме Т, тyпенаме У>темплате<>
Објашњење: template<> се може користити само за специјализације шаблона.
8. задатак
На које све начине је могуће дефинисати класу Б изведену из класе А?
цласс Б : виртуал А {...};цласс Б : протецтед публиц А {...};цласс Б : оверриде А {...};цласс Б : А {...};цласс Б : публиц А {...};
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.