ОО1/Пробни тестови 2020
- За питања са више одговора, тачни одговори су подебљани и уоквирени
- За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
- Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:
Први тест
На сваком питању је било или могуће изабрати једно или више решења или унети одговор у поље.
1. задатак
Приликом реупотребе објектно оријентисаног кода извођењем, у начелу се стари код (постојећа класа - основа за извођење):
- не мора мењати ни поново преводити и тестирати.
- не мора мењати, али се мора поново преводити и тестирати.
- не мора мењати, мора поново преводити, али се не мора поново тестирати.
- мора мењати и поново преводити и тестирати.
- уопште не може искористити.
2. задатак
Која наредба омогућава коришћење имена X из простора имена Y простим именовањем X, уколико не постоји конфликт имена?
decltype Y;
using namespace Y;
using Y::X;
namespace Y.X;
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;
###
}
а2.з=1;
a1.y=1;
a2.y=1;
а1.x=1;
а1.з=1;
a2.x=1;
5. задатак
Које функције су исправне, јер враћају референцу на "жив" објекат?
int& f(int &i){int r=i; return r; }
int& f(int i){return i; }
инт& ф(инт &и){ретурн *неw инт(и); }
инт& ф(инт &и){инт &р=*неw инт(и); ретурн р; }
инт& ф(инт &и){ретурн и; }
int& f(int &i){int r=*new int(i); return r; }
Објашњење: Прва функција враћа референцу на локалну променљиву у коју је копирана вредност. Друга функција исто, али се копирање дешава при прослеђивању аргумената. Шеста функција алоцира објекат на хипу, али онда његову вредност копира у локалну променљиву па враћа референцу на ту променљиву.
6. задатак
Који од следећих исказа су тачни на језику C++?
- Класа може имати више приватних секција.
- Из метода позваног за неки објекат се не може приступити приватном атрибуту другог објекта исте класе.
- Јавној секцији класе могу приступати само јавни методи класе, а приватној секцији само приватни методи.
- Члановима у приватној секцији класе може приступати само јавни метод исте класе.
- Подразумевана секција класе је јавна.
7. задатак
За непроменљив и непостојан (const volatile
) објекат класе могу да се позивају методи те класе са наведеним следећим модификаторима (који одређују природу текућег објекта):
inline
const
volatile
цонст волатиле
- без модификатора
8. задатак
Нека је дата дефиниција класе Тест
class Test{
Test(){}
};
За које од следећих линија кода у функцији маин() ће преводилац пријавити грешку?
Тест тест;
Тест* тест = неw Тест();
Test test();
Test* test;
Тест тест{};
Објашњење: Подразумевани конструктор се налази у приватној секцији. Опција под ц је декларација методе а опција под д не прави објекат уопште.
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. задатак
- Исти задатак се нашао и на пробном колоквијуму за ИР.
Који од следећих оператора се морају преклопити као нестатички методи у језику C++?
operator()
operator[]
operator<<
operator=
operator+
2. задатак
- Исти задатак се нашао и на пробном колоквијуму за ИР.
Повезати операторе са одговарајућом типичном применом:
- Рачунање вредности полинома у тачки оператор()
- Паметни показивач оператор->
- Асоцијативни приступ елементу збирке оператор[]
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. задатак
Које тврдње су тачне?
- Оператор
delete
може имати произвољан број аргумената. - У преклопљеном оператору
new
треба, као последњу наредбу, написати експлицитан позив конструктора класе за коју се оператор преклапа. - Класа може имати више преклопљених
delete
оператора за појединачне објекте. - Оператори
new
иdelete
се преклапају као статички методи класе. - Класа може имати више преклопљених оператора
new
за низове.
5. задатак
Која од следећих тврдњи у вези извођења класа су тачна у језику C++?
- Из класе означене модификатором
final
није могуће даље извођење. - Дозвољено је следеће извођење:
class A : B { }; class B : A { };
- Подразумеван начин извођења је заштићен (
protected
). - Изведена класа не наслеђује конструкторе, деструктор и операторе
operator=
из основне класе. - Извођење може бити јавно (
public
), заштићено (protected
) или приватно (private
).
6. задатак
Који искази су тачни? Изаберите један одговор:
- Приватним извођењем успоставља се релација садржања између објекта изведене класе и наслеђеног подобјекта основне класе.
- Објекат заштићено изведене класе је једна врста објекта основне класе у свакој глобалној функцији.
- Објекат јавно изведене класе наслеђује само имплементацију основне класе, не и уговор.
- Код приватног извођења наслеђује се уговор основне класе.
- Јавним извођењем се само успоставља релација садржања између објекта изведене класе и наслеђеног подобјекта основне класе.
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];
}
- ЦААБЦААБ
- АЦБАЦБ
- ААЦБААЦБ
- АЦАБАЦАБ
Објашњење: Прво се иницијализује подобјекат А, а затим атрибути типа 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;
}
- ~А() { цоут << "А"; }
- ~А() { цоут << "БА"; }
- виртуал ~А() { цоут << "БА"; }
- виртуал ~А() { цоут << "А"; }
Објашњење: Уколико је деструктор виртуелан, позваће се деструктор и основне класе. Валидна алтернатива јесте да невиртуелни деструктор само испише тражени текст.
10. задатак
Које тврдње су тачне?
- Вишеструким извођењем се сматра извођење из више класа које нису у узајамном односу извођења (наслеђивања).
- Вишеструким извођењем се сматра извођење у којем је једна класа родитељ већег броја класа.
- Вишеструким извођењем се сматра извођење из већ изведене класе.
- Вишеструким извођењем се сматра извођење из класе из које су већ изведене неке друге класе.
- Вишеструким извођењем се наслеђују уговори и имплементације свих родитељских класа.
ИР колоквијум
1. задатак
Простор на стеку се додељује:
- Локалним статичким објектима
- Глобалним статичким објектима
- Аргументима (параметрима) функција
- Динамичким објектима
- Локалним аутоматским објектима
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;
}
- 133
- 233
- Програмски код се не преводи.
- 132
- 232
Објашњење: auto
, за разлику од decltype
не задржава да ли је тип био референца или показивач, па је тип y
само int
и промена над y
се не осликава над z
.
3. задатак
Које тврђење је тачно?
- Механизам преклапање[сиц] имена функција је потпуно статички, која функција ће се позвати одређује се у време превођења.
- Механизам преклапање[сиц] имена функција је потпуно динамички, која функција ће се позвати одређује се у време извршавања.
- Механизам преклапање[сиц] имена функција је потпуно статички, која функција ће се позвати одређује се у време извршавања.
- Механизам преклапање[сиц] имена функција је потпуно динамички, која функција ће се позвати одређује се у време превођења.
4. задатак
Која тврђења су тачна на програмском језику C++?
- Методи
int f() & { return 1; }
иint f() && { return 3; }
могу постојати у истој класи. - Методи
int f() & { return 1; }
иint f() const & { return 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
) функције и класе?
- Ако је класа
A
пријатељ класеB
и класаB
пријатељ класеC
, онда је и класаA
пријатељ класеC
. - Функција
m()
која је пријатељ класиA
може бити глобална функција. - Ако класа
A
прогласи класуB
за пријатеља, методи класеA
имају приступ до приватних поља класеB
- Пријатељство између класа је симетрична релација.
- Функција
m()
која је пријатељ класиA
може бити метод класеB
.
8. задатак
Који од следећих оператора се морају преклопити као нестатички методи у језику C++?
оператор[]
оператор=
оператор()
operator+
operator<<
9. задатак
Повезати операторе са одговарајућом типичном применом:
- Рачунање вредности полинома у тачки оператор()
- Паметни показивач оператор->
- Асоцијативни приступ елементу збирке оператор[]
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.