ОО1/Јануар 2022
- За питања са више одговора, тачни одговори су подебљани и уоквирени
- За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
- Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:
Г1
1. задатак
Шта је тачно за наведени исечак кода на језику C++?
#include <iostream>
using namespace std;
int main() {
int niz[] = { 1, 2, 3 };
int i;
cin >> i;
cout << niz[i];
}
- Постоји проблем цурења меморије.
- Низ има тачно 3 елемента.
- Постоји проблем са висећим показивачем.
- Ако се на стандардни улаз упише 1, програм ће исписати 1.
2. задатак
Шта је могуће ставити уместо ??? на овом исечку кода на језику C++?
#include <iostream>
using namespace std;
int main() {
char slova[] = "slova";
char* const pk = slova;
???
}
pk++;(*пк)++;pk = "xyz";цхар ц = пк[1];пк[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;
???
}
obj.a = 5;обј.б = 5;обј.y = 5;obj.x = 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
- 11
- 12
- 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;
}
- Програм се не преводи.
- 0120
- 0102
- Ниједан од понуђених одговора.
Објашњење: Креће се са иницијализацијом C, па се прелази на иницијализацију њеног подобјекта класе Б. Б садржи поље типа А па се прво иницијализује А и исписује 0, а затим завршава иницијализација Б и исписује 1. Након тога се прелази на иницијализацију поља класе А у C и исписује 0, и на крају се извршава конструктор C који исписује 2.
6. задатак
Шта је тачно од следећих навода о преклапању оператора на језику C++?
- Ако се преклопи оператор
newгуби се подразумевани конструктор. - Када се преклапа
(), оператор може да прими произвољно параметара али сви морају да буду стандардног типа. - Функцијска класа је класа која преклапа барем један од оператора
() [] ->. - Класа може имати више преклопљених
newоператора. newоператор се преклапа као статички метод.
7. задатак
Шта је тачно од следећих навода о апстрактним класама на језику C++?
- Апстрактна класа је она која има барем једну апстрактну методу.
- Статички метод може да буде апстрактан.
- Класа може бити апстрактна ако су јој деструктор и све методе конкретне.
- Да би изведена класа била конкретна, мора да конкретизује све апстрактне методе.
- Апстрактна класа се означава са
abstractу дефиницији преclass.
8. задатак
Шта је тачно од следећих навода о шаблонским класама на језику C++?
- Може се изводити из шаблонских класа.
- Шаблонска класа не може имати виртуелне методе.
- Шаблонски методи не могу бити виртуелни.
- ??
- ??
9. задатак
Шта је тачно од следећих навода о виртуелним методама на језику C++?
- Деструктор може да буде виртуелан.
- Конструктор може да буде виртуелан.
- Статички метод може да буде виртуелан.
- Пријатељска глобална функција може бити виртуелна.
- Нестатички метод може да буде виртуелан.
10. задатак
Шта је тачно од следећих навода о руковаоцима изузетака на језику C++?
- Руковалац типа
doubleможе да прихвати изузетке типаint. - Руковалац типа
...прихвата све типове изузетака. - Руковалац типа
intможе да прихвати изузетке типаdouble. - Изузетак може да се баци из
tryблока. - Изузетак не може да се баци из
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;
####
}
p++;*п = 1;p = &b;стд::цоут << п;стд::цоут << *п;
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;
***
}
која од ових наведених наредби исправно замењује ***?
y.b = 2;X::ц = 5;y.a = 1;X::d = 3;y.д = 4;
5. задатак
Шта од следећег важи за преклапање оператора на програмском језику C++?
- Уколико је леви операнд бинарне операције стандардног типа мора се преклопити као метод одговарајуће класе.
- Оператор
[]се мора преклопити као глобална пријатељска функција. - Оператор доделе се мора преклопити као нестатички метод класе.
- Оператор
()се мора преклопити као нестатички метод класе. - Бинарни оператор
+је могуће преклопити и као метод класе и као глобалну пријатељску функцију.
6. задатак
Шта од следећег важи за извођење на програмском језику C++?
- Објекти изведене класе садрже безимени подобјекат основне класе.
- Преко објеката изведене класе заштићеним члановима основне класе се приступа исто као јавним члановима изведене класе.
- Језици који подржавају извођење се називају објектно базирани језици.
- Модификатор
finalсе користи за класу која није изведена ни из једне класе. - Када се нека класа изведе из класе 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;
}
- бxyз
- бxбyз
- бyxз
- бyбxз
- Програм се не преводи.
Објашњење: Први пример редоследа конструкције на крају презентације из извођења професора Игора Тартаље.
8. задатак
Које тврдње у вези оператора за динамичку конверзију (dynamic_cast) су тачне?
- Оператор за динамичку конверзију примењен на референцу типа основне класе при неуспешној конверзији у референцу на изведену класу баца изузетак типа
bad_cast. - Оператор за динамичку конверзију се мора примењивати за сваку конверзију навише (
upcast) која се врши у време извршења програма. - Оператор за динамичку конверзију се може применити на показивач или референцу на објекат неполиморфне основне класе.
- Оператор за динамичку конверзију примењен на показивач типа основне класе враћа
nullptrако конверзија у показивач типа изведене класе не успева. - Оператор за динамичку конверзију гарантује да ће се конверзија у време извршења правилно извршити и да ће објекат бити конвертован у циљни објекат.
9. задатак
Ако су I1, I2, I3 и I4 класе изузетака и ако је у основној класи A декларисан метод:
virtual void m() throw (I1, I2, I3);
декларација метода m() у изведеној класи B може да буде:
воид м() ноеxцепт;воид м() тхроw ();воид м() тхроw (И1, И2, И3);воид м() тхроw (И1);воид м() тхроw (И2, И4);
10. задатак
Ако је генеричка класа дефинисана на следећи начин:
template <class T> class K { void m(T t); };
метод m може да буде дефинисан изван класе K на следећи начин:
воид К::м(Т т) { ... }темплате <цласс Т> воид К<Т>::м(Т т) { ... }воид К<Т>::м(Т т) { ... }