ТЕСТ 4
въпросите на теста, един верен отговор (да), и един грешен
"отговор" (не)
Посочете
верните твърдения за многократна/виртуална наследственост, и за
получаване на информация за типа по време на изпълнение.
(да) Многократна наследственост има, когато производният клас има
два или повече базови класове.
(не) Многократна виртуална
наследственост има винаги, когато в класа има виртуална функция.
Даден е
клас-шаблон:
template<typename
T, int R, int C>
class
Matrix {
public:
Matrix();
private:
T* data[R][C];
};
Определете
верни и неверни дефиниции на обекти от този клас.
(да) Matrix<int,
2, 2> m;
(не)
Matrix<10, 3, 3> a10;
Нека класът D наследява класа B,
b е обект от класа B, d е обект
от класа D, pb е указател от класа B и
pd е указател от класа D. И в двата класа е
дефинирана виртуална функция f. Кои от следните оператори
са верни и кои - не?
(да) pd = dynamic_cast<D*>(pb);
(не) d = b;
Дадени са следните дефиниции на класове:
class Employee {
...
};
class Manager : public Employee {
...
};
Определете верните и неверните твърдения.
(да) Класът Employee е базов клас и класът Manager
е производен клас.
(не) Класът Manager е базов клас и класът Employee
е производен клас.
Дадени са следните дефиниции:
ifstream inp;
ofstream out;
int k = 42;
char ch = 'X';
const double PIN = 5.5;
Отбележете правилните и неправилните оператори относно синтаксис.
(да) inp.get(ch);
(не) inp.get(PIN);
Отбележете с "да" случаите, когато
дадената редица от цифри съответства на дадения вход на програмата.
int dig(int n)
{
cout << n;
if (n > 9) return dig(n/10) + 1;
else return 1;
}
int main()
{
int k;
cin >> k;
cout << dig(k);
return 0;
}
Означението е: <входно число> -> <изходна редица>.
(да) 122 -> 1221213
(не) 13 -> 1332
Отбележете верни и грешни твърдения
относно сортиране и търсене.
(да) За метода сортиране чрез избор удвояване на броя на елементите
води до четирикратно учеличаване на времето за сортиране.
(не) За метода сортиране чрез сливане удвояване на броя на
елементите води до четирикратно учеличаване на времето за сортиране.
Даден е свързан списък и итератор:
list<int> slist;
list<int>::iterator lit;
Списъкът съдържа 10 елементи и итераторът сочи втория елемент. Верен
ли е даденият израз относно синтаксис и логика ?
(да) *lit > 0
(не) slist++
Даден е класа:
class Btree{
public:
Btree();
Btree(const Btree& b);
~Btree();
Btree& operator=(const Btree&
b);
...
};
и обект b от този клас. Проверете твърденията за оператори
от функция main:
(не) В оператора Btree b1 = b; се извиква предефинираната
операция присвояване.
(да) В оператора Btree b1(b); се извиква конструктора за
копиране.
Възможно ли е да се предефинира следващата
операция за обекти от класа Time, като използваме следната
декларация на обикновена функция?
(не) bool operator>(Time);
(да) long operator-(Time, Time);
Възможно ли е да се предефинира следващата
операция за обекти от класа Time, като използваме следната
декларация на член-функция?
(да) bool Time::operator==(Time);
(не) istream& Time::operator>>(Time&);
Отбележете верни/неверни твърдения за
предефиниране на операции и шаблони.
(да) Клас-шаблон е механизъм, който позволява да се създават
класове, чиито членове данни са от произволен тип.
(не) Функцията operator= може да не бъде член-функция.
Нека е даден следния клас-шаблон:
template <typename T>
class Temp {
public:
Temp(T t)
{
data = new T(t);
}
private:
T* data;
};
Може ли в класа да се добави деклaрация/дефиниция на следната
функция:
(да) T get() const { return *data; }
(не) Temp go();
Дадена е следната част от програма:
void fun3()
{
throw runtime_error("RTE" );
}
void fun2() throw(runtime_error)
{
// блок на функцията
}
void fun1() throw(runtime_error)
{
fun2();
}
int main()
{
try
{
fun1();
}
catch (runtime_error e)
{
cout<<e.what();
}
return 0;
}
Поставете в блока на функцията fun2 дадения оператор или
дадените оператори и отбележете с "да" случая на отпечатване на
съобщение RTE при изпълнението на програмата.
(да) fun3();
(не) fun1();
Дадена е част от програма:
class Vec {
public:
class Range {
public:
int index;
Range(int j):index(j) {}
};
int& operator[](int i)
{
if (0<=i &&
i<100) return p[i];
throw Range(i);
}
...
};
void do_any(Vec& w);
void do_some(Vec& w);
void f(Vec& v)
{
do_any(v);
try
{
do_some(v);
}
catch(Vec::Range r)
{
cerr << "ERROR" <<
r.index;
...
}
...
}
Верни ли са следните твърдения?
(да) r е обект от тип Vec::Range.
(не) r е обект от тип Range.