UWAGA! PoniŜej są pytania z egzaminu, z zaznaczonymi poprawnymi odpowiedziami. Przy niektórych z nich napisałem jakieś słowo komentarza (czemu tak, a nie inaczej...). Przypominam, Ŝe zasada punktacji była taka, Ŝe naleŝało mieć wszystkie poprawne odpowiedzi zaznaczone, brak którejś lub zaznaczenie odpowiedzi niepoprawnej oznaczał otrzymanie 0 pkt (wyjątki od tej reguły są skomentowane przy odpowiedziach). 1. Przeanalizuj poniŝszy kod i zaznacz wszystkie poprawne odpowiedzi: #include <string> class A { A(); private: int i = 5; std::string s("abc"); ; a. w kodzie jest błąd, poniewaŝ pole int i nie moŝe być zainicjalizowane w miejscu deklaracji b. w programie jest błąd, poniewaŝ obiekt s nie moŝe być utworzony w miejscu deklaracji c. w kodzie nie ma błędu d. w kodzie jest błąd, bo konstruktor jest w części prywatnej 2. Co na ekranie wydrukuje następujący kod: #include <string> class A { A(): i(5), s("abc") { int i; string s; ; A a; cout << "s is " << a.s.data() << endl; cout << "i is " << a.i << endl; a. program wyświetli s is abc a potem i is 5 b. program wyświetli s is abc a potem i is 0 c. program wyświetli s is a potem i is 5 d. program wyświetli s is a potem i is 0 e. program wyświetli s is a potem i is 3. Jeśli wywołana jest metoda z parametrem będącym referencją do obiektu, to przekazywany do niej jest: a. zawartość obiektu b. kopia obiektu c. referencja do obiektu d. obiekt jest kopiowany i wtedy referencja do niego 4. Przeanalizuj poniŝszy kod: class Circle { Circle(double radius) { radius = radius; private: double radius; ; a. kod zgłosi błąd kompilacji, bo nie ma w nim funkcji main
b. program się skompiluje, ale nie moŝna utworzyć obiektu Circle o określonym promieniu, bo ten zawsze będzie wynosił 0 c. program się skompiluje, ale nie moŝna utworzyć obiektu Circle o określonym promieniu, bo ten zawsze będzie miał wartość nieokreśloną d. w programie jest błąd, bo nie moŝna przypisać radius = radius e. kod się nie skompiluje, bo w Circle brak domyślnego konstruktora
5. Przeanalizuj poniŝszy kod: class B { B() { private: int k; ; B b; cout << b.k << endl; return 0; a. program wyświetli 0 b. program wyświetli 1 c. program wyświetli przypadkową liczbę d. w kodzie jest błąd, bo nie ma dostępu do b.k e. w programie wystąpi błąd wykonania, bo b.k nie ma określonej wartości 6. Co jest efektem poniŝszego kodu: class Foo { int x; // data field int y; // data field Foo() { x = 10; y = 10; void p() { int x = 20; // local variable cout << "x = " << x << " "; cout << "y = " << y << endl; ; Foo foo; foo.p(); a. x = 10 y = 10 b. x = 20 y = 20 c. x = 20 y = 10 d. x = 10 y = 20 7. Co jest wynikiem działania poniŝszego kodu: string s("abcdefag"); cout << s.find("def") << " " << s.find("a", 3); a. 3 0 b. 3 6 c. 2 4 d. 0 0
8. Które z poniŝszych wyraŝeń są poprawne jeśli chcemy zmazać obiekt dynamiczny wskazywany przez wskaźnik p? a. delete *p; b. delete p; c. delete [] *p; d. delete [] p; 9. Co jest efektem dzialania poniŝszego kodu class A { int x; int y; int z; A(): x(1), y(2), z(3) { ; A a; A *p1 = &a; a.x = 2; A a1; p1 = &a1; cout << p1->x << " " << (p1*).y << " " << p1->z; a. 1 1 1 b. 1 1 2 c. 1 2 3 d. 2 2 2 e. 3 3 3 10. Które z poniŝszych twierdzeń są prawdziwe? a. Circle circle = Circle() tworzy obiekt klasy Circle za pomocą bezargumentowego konstruktora i kopiuje jego zawartość do circle b. Circle circle = Circle(5) tworzy obiekt klasy Circle o promieniu 5 i kopiuje jego zawartość do circle c. Circle circle = Circle() naleŝy zamienić na Circle circle d. Circle circle = Circle(5) naleŝy zamienić na Circle circle(5) KOMENTARZ : rozumiem, Ŝe odpowiedzi c i d mogły budzić niejednoznaczność, w sensie co to znaczy naleŝy, sens polegał na ograniczeniu tworzenia obiektów tymczasowych. 11. Wyobraź sobie, Ŝe circle1 i circle2 to obiekty klasy Circle. Co robi kod: circle2 = circle1 a. kopiuje zawartość circle1 do circle2 za pomocą operatora = b. powoduje, Ŝe circle1 i circle2 to ten sam obiekt c. to wyraŝenie jest niepoprawne d. tworzy obiekt circle2 z circle1 za pomocą konstruktora kopiującego
12. Co jest niepoprawne w poniŝszym kodzie: class TempClass { int i; TempClass() { int i = 5; ; TempClass temp(2); a. program się nie skompiluje bo TempClass nie ma domyślnego konstruktora b. program się nie skompiluje bo TempClass nie ma konstruktora z argumentem typu int c. program się skompiluje ale przypisana wartość 5 jest tylko do lokalnej zmiennej d. program się skompiluje i dobrze działa 13. Które z poniŝszych odpowiedzi są prawdziwe: a. domyślny bezparametryczny konstruktor jest automatycznie dostarczany jeśli nie zdeklarowano w klasie Ŝadnego z konstruktorów b. przynajmniej jeden konstruktor musi być jawnie zdefiniowany c. konstruktory nie mają Ŝadnego zwracanego typu, nawet void, więc nie moŝna ich zakończyć instrukcją return d. konstruktory muszą mieć taką samą nazwę jak nazwa klasy e. konstruktory są wołane gdy tworzony jest obiekt 14. Aby dostać pierwszy element z wektora v, uŝyć moŝemy (wybierz wszystkie poprawne odpowiedzi): a. v.at(0); b. v[0]; c. *v.rend(); d. v.begin(); 15. Przeanalizuj poniŝszy kod class Date { friend void p(); private: int year; int month; int day; ; void p() { Date date; date.year = 2000; cout << date.year; p(); a. kod ma błąd składniowy bo year jest zmienną w części prywatnej b. program kompiluje się i działa poprawnie, drukując 2000 c. program będzie mieć błąd składniowy jeśli zmaŝemy linię friend void p() d. jako Ŝe składowa year jest prywatna, nie moŝna do niej się dostać poprzez date.year w funkcji p()
16. Które z poniŝszych stwierdzeń jest prawdziwe a. kaŝda klasa ma konstruktor kopiujący zgodny ze sygnaturą NazwaKlasy(NazwaKlasy&) b. konstruktor kopiujący moŝe być uŝyty do stworzenia obiektu zainicjalizowanego innym obiektem c. domyślnie, konstruktor kopiujący kopiuje kaŝdą daną z jednego obiektu do odpowiadającej mu danej w drugim obiekcie d. domyślnie, konstruktor kopiujący wykonuje tak zwaną płytką kopię 17. Które z poniŝszych twierdzeń są prawdziwe a. kaŝda klasa ma konstruktor domyślny jeśli jawnie nie zdefiniowano jawnie Ŝadnego konstruktora b. kaŝda klasa ma konstruktor domyślny jeśli nie zdefiniowano jawnie destruktora c. klasa moŝe mieć tylko jeden destruktor d. destruktor jest metodą bezargumentową 18. Funkcja, która jest powiąza z kaŝdym z obiektów danego typu nazywana jest a. funkcją statyczną b. metodą klasy c. metodą instancyjną d. metodą obiektową KOMENTARZ: tak, zdaję sobie sprawę, Ŝe to pytanie jest poraŝką wynikającą z tłumaczenia z angielskiego i nie za bardzo wynika z terminologii uŝywanej w j.polskim 19. Co jest niepoprawnego w poniŝszym kodzie class Test { static int square(int n) { return n * n; int getage() { return age; static int k = 5; private: int age; ; cout << Test::square(4); a. zmienna statyczna k nie moŝe być zainicjalizowana wewnątrz klasy b. naleŝy zamienić static int k = 5 na static int k, a na zewnątrz klasy napisać int Test::k = 5 c. naleŝy zamienić static int k = 5 na static int k, a na zewnątrz klasy napisać int Test.k = 5 d. naleŝy zamienić static int k = 5 na static int k, a na zewnątrz klasy napisać int Test->k = 5
20. NaleŜy dodać słowo kluczowe static w miejsce znaku? przed którą z poniŝszych metod class Test {? int square(int n) { return n * n;? int getage() { return age; private: int age; ; a. przed funkcją square b. przed funkcją getage c. przed obiema funkcjami, square i getage d. przed Ŝadną z nich KOMENTARZ: punktowana była równieŝ odpowiedź d (sens ma odpowiedź a, bo metoda square nie korzysta z Ŝadnej składowej klasy, ale z czysto składniowego punktu widzenia nic nie trzeba zmieniać) 21. Wyobraź sobie, Ŝe zdeklarowałeś GeometricObject *p = &object. Aby rzutować p na Circle, uŝyj a. Circle *p1 = dynamic_cast<circle>(p); b. Circle *p1 = dynamic_cast<circle*>(p); c. Circle p1 = dynamic_cast<circle*>(p); d. Circle p1 = dynamic_cast<circle>(p); 22. Które z poniŝszych twierdzeń jest prawdziwe a. przypisanie wskaźnika typu klasy pochodnej do wskaźnika typu klasy bazowej nazywane jest rzutowaniem w górę b. przypisanie wskaźnika typu klasy bazowej do wskaźnika typu klasy pochodnej nazywane jest rzutowaniem w dół c. rzutowanie w górę moŝe być przeprowadzone wprost bez uŝywania operatora rzutowania dynamic_cast d. rzutowanie w dół musi być przeprowadzone wprost tylko z uŝyciem operatora rzutowania dynamic_cast 23. Wybierz poprawne stwierdzenia a. klasa abstrakcyjna jest oznaczona słowem kluczowym abstract b. klasa jest abstrakcyjna jeśli zawiera choć jedną czysto wirtualną metodę c. klasa abstrakcyjna jest jak normalna klasa tylko Ŝe nie moŝesz utworzyć Ŝadnego obiektu takiej klasy d. moŝesz zadeklarować klasę jako abstrakcyjną nawet wtedy jeśli nie posiada Ŝadnej abstrakcyjnej metody 24. Która z poniŝszych jest funkcją abstrakcyjną a. virtual double getarea(); b. virtual double getarea() = 0; c. double getarea() = 0; d. double getarea(); 25. Które z poniŝszych zdań są prawdziwe a. jeśli funkcja jest zdefiniowana jako wirtualna w klasie bazowej, automatycznie jest wirtualna we wszystkich klasach pochodnych i nie trzeba dodawać słowa virtual w deklaracjach tej funkcji w klasach pochodnych b. jeśli nie planuje się redefinicji funkcji w klasach pochodnych, wydajniej jest zadeklarować ją jako niewirtualną w klasie bazowej c. funkcja wirtualna moŝe być implementowana w kaŝdej kolejnej klasie pochodnej, a kompilator dynamicznie wiąŝe tą funkcję podczas wykonywania programu na
podstawie aktualnego typu obiektu, do którego odnosimy się przez wskaźnik lub referencję d. kompilator znajduję właściwą funkcję na podstawie typów parametrów, liczby parametrów i ich kolejności
26. Co wydrukuje się dzięki poniŝszemu kodowi class C { virtual string tostring() { return "C"; ; class B: public C { string tostring() { return "B"; ; class A: public B { string tostring() { return "A"; ; void displayobject(c p) { cout << p.tostring(); displayobject(a()); displayobject(b()); displayobject(c()); a. ABC b. CBA c. AAA d. BBB e. CCC 27. Które z poniŝszych twierdzeń są prawdzie a. funkcja moŝe być przeciąŝona w tej samej klasie b. funkcja moŝe być przedefiniowana w tej samej klasie c. jeśli funkcja przeciąŝa inną funkcję, obie muszą mieć taką samą sygnaturę d. jeśli funkcja redefiniuje funkcję wirtualną, obie muszą mieć taką samą sygnaturę 28. Wyobraź sobie klasę A dziedziczącą z B i zarówno A jak i B mają bezargumentowe konstruktory. Aby wywołać konstruktor B z A, uŝyj a. A() : B() { b. A() : { B(); c. B() : A() { d. B() : { A(); 29. Które z poniŝszych twierdzeń są poprawne a. klasa pochodna jest podzbiorem klasy bazowej b. klasa pochodna zwykle jest bardziej specjalizowana niŝ klasa bazowa c. class A : B oznacza, Ŝe A jest prywatnie dziedziczone z B d. class B : public A oznacza, Ŝe A jest publicznie dziedziczone z B
30. Co wydrukuje się z działania poniŝszego kodu class C { virtual string tostring() { return "C"; ; class B: public C { string tostring() { return "B"; ; class A: public B { string tostring() { return "A"; ; void displayobject(c *p) { cout << p->tostring(); displayobject(&a()); displayobject(&b()); displayobject(&c()); a. ABC b. CBA c. AAA d. BBB e. CCC 31. Co jest niepoprawnego w tym kodzie class Fruit { Fruit(int id) { ; class Apple: public Fruit { Apple() { ; a. program się skompiluje jeśli dodasz bezargumentowy konstruktor do klasy Fruit b. w kodzie jest błąd z powodu braku domyślnego konstruktora w klasie Fruit c. kod się skompiluje jeśli zmaŝesz obecny konstruktor w klasie Fruit d. kod się skompiluje po zamianie Apple() na Apple() : Fruit(4) 32. ZałóŜmy Ŝe klasy Cicrle i Rectangle są wyprowadzone z klasy GeometricObject i napisałeś void displaygeometricobject(geometricobject shape){ cout << shape.tostring() << endl; Które z poniŝszych wywołań funkcji jest poprawne a. displaygeometricobject(geometricobject("black", true)); b. displaygeometricobject(circle(5)); c. displaygeometricobject(rectangle(2, 3)); d. displaygeometricobject(string());
33. Jaka jest poprawna i najlepsza sygnatura operatora = a. Rational operator=(const Rational secondrational); b. const Rational& operator=(const Rational &secondrational); c. Rational& operator=(const Rational &secondrational); d. Rational operator=(rational &secondrational); 34. Jaka jest poprawna sygnatura operatora konwersji jeśli ten ma zmienić Rational na double a. double operator() b. double operator double() c. Rational operator double() d. operator double() 35. Jaka jest poprawna sygnatura przeciąŝonego operatora >> a. friend istream &operator>>(istream &stream, const Rational &rational); b. friend istream &operator>>(istream &stream, Rational &rational); c. friend istream operator>>(istream &stream, Rational &rational); d. friend istream operator>>(istream &stream, const Rational &rational); KOMENTARZ: chodziło o sygnaturę spełniającą wszystkie kryteria poprawności (a nie tylko o to, Ŝe składniowo jest ok), np. odpowiedzi c i d nie dałoby się łączyć w łańcuch, odp. b dopuszcza potencjalną ingerencję zewnętrznego operatora w obiekt klasy Rational 36. Jaka jest poprawna sygnatura przeciąŝonego operatora postinkrementacji a. Rational operator++(rational &r) b. Rational operator++() c. Rational operator++(int dummy) d. Rational operator++(int &dummy) 37. Z niŝej wymienionych operatorów moŝna przeciąŝyć a. + b. += c. > d. && e.?: 38. ZałóŜmy Ŝe statement3 rzuca wyjątek typu Exception3 w następującym kodzie try { statement1; statement2; statement3; catch (Exception1 ex1) { catch (Exception2 ex2) { catch (Exception3 ex3) { statement4; throw; finally { statement5; Które z wyraŝeń (statement) są jeszcze wykonane po wykonaniu statement3 (zgłaszającego wyjątek) a. statement1 b. statement2 c. statement3 d. statement4 e. statement5 KOMENTARZ: poniewaŝ powyŝszy kawałek to jest pseudokod, więc mogło to wprowadzić zamieszanie: punktowana była równieŝ odpowiedź (samo) d, ktoś nawet napisał, Ŝe finally nie było na wykładzie ;-) 39. Funkcja what() zdefiniowana jest w klasie a. exception b. runtime_error c. overflow_error
d. underflow_error e. bad_exception
40. Jeśli wpiszesz 1 0 to co zostanie wypisane int main(){ cout << "Podaj dwie liczby int: "; int number1, number2; cin >> number1 >> number2; try { if (number2 == 0) throw number1; cout << number1 << " / " << number2 << " is " << (number1 / number2) << endl; cout << "C" << endl; catch (int e) { cout << "A" << endl; cout << "B" << endl; a. A b. B c. C d. AB 41. Co jest niepoprawnego w tym kodzie vector<int> v; v[0] = 2.5; a. błąd składniowy, bo w wektorze nie ma Ŝadnych elementów b. błąd składniowy, bo wektor przechowuje typy int c. błąd podczas wykonywania, bo w wektorze nie ma elementu na pozycji 0 d. błąd wykonywania, bo przypisuje się double do wektora zawierającego int e. wszystko jest poprawne, zajdzie trywialna konwersja z double do int 42. Które stwierdzenia są prawdziwe a. klasa szablonowa moŝe być dziedziczona z klasy szablonowej b. klasa szablonowa moŝe być dziedziczona z klasy nieszablonowej c. nieszablonowa klasa moŝe być dziedziczona ze specjalizacji klasy szablonowej d. przyjaciół (deklaracja friend) uŝywa się tak samo w klasach szablonowych jak i nieszablonowych e. w klasie szablonowej moŝna zdefiniować zmienną statyczną 43. ZałóŜmy, Ŝe mamy kod template<typename T, int capacity> class Stack{ Stack(); //... private: T elements[capacity]; int size; ; Które z poniŝszych stwierdzeń są prawdziwe a. Stack<double, 40> s; b. Stack<int, 50> s; c. Stack<50> s; d. Stack<int, double> s;
44. ZałóŜmy Ŝe mamy kod template<typename T = int> class Stack { Stack(); //... ; Które wyraŝenia są wtedy poprawne a. Stack<double> s; b. Stack<int> s; c. Stack<> s; d. Stack s; e. Stack<int, double> s; 45. Jeśli zdefiniujesz funkcję swap w następujący sposób template<typename T> void swap(t &var1, T &var2){ T temp = var1; var1 = var2; var2 = temp; MoŜesz jej uŝyć poprzez wywołanie a. swap(1, 2) b. int v1 = 1; int v2 = 2; swap(v1, v2); c. int v1 = 1; int v2 = 2; swap(&v1, &v2); d. int v1 = 1; double v2 = 2; swap(v1, v2); 46. Zdefiniowaliśmy szablon funkcji template<typename T1, typename T2> T1 maxvalue(const T1 &value1, const T2 &value2){ if (value1 > value2) return value1; else return value2; Które jego uŝycie jest poprawne a. cout << maxvalue(1, 2) b. cout << maxvalue(1.5, 2.5) c. cout << maxvalue('a', 'B') d. cout << maxvalue("ab", "AB") e. cout << maxvalue(1.5, 2) 47. Prefiks (początek) szablonu o dwóch parametrach moŝna zdefiniować tak a. template<typename T1, typename T2> b. template<class T1, class T2> c. template<typename T1, T2> d. template<class T1, T2>
48. Które z poniŝszych kontenerów uŝywają iteratorów a. list b. deque c. vector d. multimap e. stack 49. Aby wstawić element do wektora v, moŝna uŝyć a. v.assign(0, element) b. v.insert(0, element) c. v.push_back(element) d. v.add(element) 50. Co jest efektem działania poniŝszego kodu int values[] = {1, 2, 3, 4, 5; vector<int> intvector(5); vector<int>::iterator last = copy(values, values + 3, intvector.begin()); ostream_iterator<int> output(cout, " "); cout << "intvector: "; copy(intvector.begin(), last, output); a. intvector: 2 3 4 b. intvector: 1 2 3 4 c. intvector: 1 2 3 d. intvector: 3 4 5 e. intvector: 2 3 4 5