2006

Transkrypt

2006
PROGRAMOWANIE II (C++/OOP) – EGZAMIN 26 VI 06
INFORMATYKA STOSOWANA UJ ROK I
1.
W pierwszym pliku widzimy deklaracj globalnej zmiennej
extern int a;
oraz funkcj , która j wypisuje:
void fun() { cout << ::a << endl; }
W głównym pliku widzimy tak definicj :
static int a = 3.14;
oraz wywołanie funkcji fun() w programie. Co si stanie?
a. Program si nie skompiluje, bo w pierwszym pliku jest tylko deklaracja a, za funkcja fun() usiłuje t
zmienn wykorzysta b. Kompilator zgłosi ostrze enie o konwersji, program za wypisze warto 3
c.
Program si nie skonsoliduje poniewa zmienna a jest widziana tylko w obszarze głównego pliku
d. Program si nie skonsoliduje, poniewa zmienne statyczne ł czone s zewn trznie
2.
Nast puj cy kawałek kodu:
#include <iostream>
#include <string>
using std::string;
int main() {
string typname = "I am Jas Fasola/n";
std::cout << typname << endl;
}
nie skompiluje si , a powód to:
a. Funkcja main() zdefiniowana jako zwracaj ca int nic nie zwraca
b. Bł d inicjalizacji zmiennej typu string, bo zamiast /n powinno by \n
c.
Nie jest zdefiniowany endl
d. Słowo typname jest słowem kluczowym w C++
3.
Spójrzmy na kawałek kodu (nieistotne dla przykładu cz ci pomin to):
// ...
namespace A1 { int a = 3; }
namespace {
using namespace A1;
int a = 2;
}
int main() {
int a = 1;
cout << ::a << endl;
// ...
}
Oczekiwa ! nale" y, # e:
a. Nie skompiluje si$ z powodu ponownej deklaracji zmiennej a
b. Nie skompiluje si% , poniewa& w linii gdzie jest wypisywana, nie jest znana ' adna zmienna globalna a
c. Program wypisze liczb ( 3
d.
Program wypisze liczb ) 2
4.
Spójrzmy na do *+ dziwaczny kawałek kodu:
int a = true + false;
int b = --a ? a : ( a = 3 );
cout << "b = " << b << endl;
W efekcie:
a. Program si, nie skompiluje z powodu przypisania w pierwszej linijce
b.
Program wy - wietli b = 3
c. Program wy . wietli b = 0
d. Program si/ nie skompiluje z powodu bł0 du składniowego w drugiej linii
5.
Co si1 stanie z takim kodem:
int a = 3;
int* const v1 = &a;
(*v1)++;
int* v2 = static_cast<int*>(v1);
1
a.
b.
c.
d.
Ostatecznie warto wskazywana przez wska nik v2 wyniesie 4
Kompilator zaprotestuje w ostatniej linii z powodu rzutowania, które pozbawia przydomka const
(nale ałoby u y const_cast)
Kompilator zaprotestuje w trzeciej linii, przy próbie przesuni cia tego, na co pokazuje wska nik v1
Kompilator zaprotestuje w trzeciej linii z powodu próby zmiany warto ci wskazywanej przez wsk. v1
6.
Abstrakcja danych to:
a. Ukrywanie nieistotnych szczegółów implementacyjnych w cz ci prywatnej lub chronionej klasy
b. Tworzenie relacji zale no ci pomi dzy typami zdefiniowanymi przez u ytkownika
c. Tworzenie rozdziału pomi dzy u ytkownikiem a programist , czyli interfejsem a implementacj d.
Tworzenie nowych typów, zazwyczaj za pomoc definiowania klas
7.
Mamy klas :
class A {
const int a;
public:
A(int) : a(9) { }
int* b = &a;
};
// gdzie w programie
A objA(0);
*objA.b = 3;
W tym kodzie:
a. Do ostatniej linii b dzie zastrze enie próby zmiany warto ci zmiennej a, która jest w cz ci prywatnej
b.
Nie skompiluje si , bo wska nik inicjalizujemy od razu adresem zmiennej
c. Obiekt objA klasy A nie zostanie utworzony, gdy konstruktor ma nie nazwany argument typu int
d. Nie skompiluje si! , bo przypisujemy niestałemu wska" nikowi zmienn# b $ d % c& stał'
8.
Mamy klas(
class A {
public:
A() { }
mutable int a;
static int* b;
};
int* A::b;
oraz kawałek programu:
const A aa;
aa.a++;
(++aa.b)++;
Na temat tego kodu mo) na powiedzie * , + e:
a.
Kod si, skompiluje
b. Nie skompiluje si- , bo tworzymy stały obiekt aa klasy A, a nast. pnie naruszamy jego stało /10 , bo
zwi2 kszamy jego składow3 a
c. Nie skompiluje si4 , bo tworzymy stały obiekt aa klasy A, a nast5 pnie zmieniamy warto 67 nie
zainicjalizowanej składowej statycznej b
d. Post-inkrementacja w ostatniej linii nie mo8 e działa 9 na wyniku pre-inkrementacji
9.
Mamy klas: :
class A {
A(const A& src) { // poprawny konstruktor kopiuj ; cy }
public:
int* va;
int size;
friend int main();
};
Podstawowym mankamentem takiego kawałka kodu
int main() {
A a;
A b = a;
b = a;
}
jest to, < e:
a. Konstruktor kopiuj = cy jest prywatny, wi> c wyra? enie "A b = a" nie mo @ e byA wywołane
2
b.
c.
d.
Deklaracja przyja ni w klasie A nie pomo e w u yciu prywatnego konstruktora kopiuj cego, poniewa
wymaga ona uprzedniej deklaracji funkcji
Ostatnia linia kodu z wyra eniem "b = a" nie zadziała, bo nie ma zdefiniowanego operatora przypisania
Obiekt klasy A nie powstanie, bo klasa nie ma domy lnego konstruktora
10. Mamy trzy przeci one operatory jednoargumentowe
/* 1 */ const A& operator-(const A& a) { return &A(-a.i); }
/* 2 */ A* operator&(A& a) { return &a; }
/* 3 */ const A& operator++(A& a) { a.i++;
return a; }
Poprawny jest:
a.
Tylko trzeci
b. Pierwszy i trzeci
c. Wszystkie trzy s poprawne
d. Drugi i trzeci
11. Je li operator= nie jest zdefiniowany, kompilator podejmie prób jego automatycznego wygenerowania. Nie uda si
to:
/* 1 */ je li klasa ma składnik const
/* 2 */ dla klasy pochodnej, je li klasa podstawowa nie ma zdefiniowanego tego operatora
/* 3 */ je li klasa ma referencj /* 4 */ je li klasa ma składnik innej klasy, w której operator= jest w cz ci chronionej
W ród powy szych zda jedno jest nieprawdziwe, wska które:
a. Pierwsze /* 1 */
b.
Drugie /* 2 */
c. Trzecie /* 3 */
d. Czwarte /* 4 */
12. W ród czterech zda na temat przeci enia operatora -> wybierz jedno fałszywe:
/* 1 */ musi by funkcj składow! klasy
/* 2 */ jest jednoargumentowy i działa na argumencie po jego lewej stronie
/* 3 */ ostatecznie musi zwróci" wska# nik
/* 4 */ na tym co zwraca operator->() działa zwykły jednoargumentowy operator ->
a. Pierwsze /* 1 */
b. Drugie /* 2 */
c. Trzecie /* 3 */
d.
Czwarte /* 4 */
13. Wska$ jedno % ci & le prawdziwe zdanie w' ród czterech poni( szych dotycz) cych operatorów new i delete:
/* 1 */ wersje przeci *+ one new i delete mog, mie - wi . cej ni/ jeden parametr
/* 2 */ przeładowuj 0 c operatory new i delete globalnie, traci si 1 dost2 p do ich wersji oficjalnych
/* 3 */ przeładowuj 3 c operator new mo4 emy wpłyn 56 na wywołanie konstruktora, ju7 po przydzieleniu pami 8 ci
/* 4 */ je 9 li zaalokowanie pami: ci na stercie si ; nie powiedzie, to operator new rzuci wyj < tek typu bad_alloc
a. Pierwsze /* 1 */
b.
Drugie /* 2 */
c. Trzecie /* 3 */
d. Czwarte /* 4 */
14. Mamy taki wska= nik: int T::*ptr; oraz prost > klas? :
class T {
public:
int a, b, c;
};
Tworzymy w programie obiekt klasy T myT;
Teraz cztery linijki kodu:
/* 1 */ int T::*ptr = &T::b;
/* 2 */ T* wskT = &myT;
/* 3 */ myT.*ptr++;
/* 4 */ wskT->*ptr = 5;
Wybierz t @ , w której widzisz bł A d:
a. Pierwsze /* 1 */
b. Drugie /* 2 */
c.
Trzecie /* 3 */
d. Czwarte /* 4 */
3
15. Je li klasa B jest klas pochodn klasy A, to (wska jedno fałszywe zdanie):
a. Przy dziedziczeniu publicznym, dost p do cz ci prywatnej klasy A tylko przez jej interfejs
b.
Przy dziedziczeniu prywatnym, cz prywatna klasy A staje si cz ci prywatn klasy B
c. Domy lne jest dziedziczenie prywatne
d. Przy dziedziczeniu chronionym, cz publiczna klasy A staje si cz ci chronion klasy B
16.
Podaj poprawn kolejno inicjalizacji w poni szym kodzie, je li tworzymy obiekt klasy C:
// wcze niej definiujemy klasy: MW, MX, MY, MZ oraz klas ! A
class B : public A {
MY my;
MX mx;
public:
B(int i) : mx(), my(), A() { // ... }
~B();
};
class C : public B {
MW mw;
MZ mz;
public:
C() : mw(3.14), B(45) { // ... }
~C();
};
a.
A, MY, MX, B, MW, MZ, C
b. A, MX, MY, B, MW, MZ, C
c. MX, MY, A, B, MW, MZ, C
d. C, MZ, MW, B, MY, MX, A
17. W " ród poni# szych zda$ wska % jedno fałszywe. Nie dziedziczy si& :
a. Konstruktora kopiuj ' cego
b. Destruktora
c.
Składników statycznych
d. Operatora przypisania
18. Oto kawałek kodu, klasy M oraz N s( pochodnymi jednoznacznymi z klasy K:
class A {
public:
virtual K* write1() { cout << "A1"; }
K& write2() { cout << "A2"; }
};
class B : public A {
public:
M* write1() { cout << "B1"; }
virtual M& write2() { cout << "B2"; }
};
// ... w programie
A *ptrA = new B;
B *ptrB = new B;
Nast) puj * ce cztery linie kodu:
/* 1 */ ptrA->write2();
/* 2 */ ptrB->write1();
/* 3 */ ptrA->write1();
/* 4 */ ptrB->write2();
wypisz + w takiej kolejno , ci jak powy- ej:
a. A2 B1 A1 B2
b. B2 B1 A1 B2
c. B2 B1 B1 B2
d.
A2 B1 B1 B2
19. Mamy taki kawałek kodu, wykorzystuj . cy RTTI:
int ii = 0, *iw = &ii;
/* 1 */ typeid(int) == typeid(ii)
/* 2 */ typeid(int) != typeid(1.0/3)
/* 3 */ typeid(int) != typeid(1/3)
/* 4 */ typeid(int) == typeid(iw)
Warto / ci logiczne ponumerowanych linii to kolejno:
4
a.
b.
c.
d.
1010
0011
1101
1100
20. W ród podanych faktów na temat dziedziczenia wirtualnego, wska jeden fałszywy:
a. Dzi ki dziedziczeniu wirtualnemu klasy bazowej, mamy jeden komplet jej zwykłych składowych
b.
Klasy wirtualne s konstruowane na ko cu, a za ich konstrukcj odpowiada klasa najbardziej pochodna
c. Je li jest wi cej klas dziedziczonych wirtualnie, to kolejno ich konstrukcji jest zgodna z kolejno ci na
li cie pochodzenia
d. Konstruktor wirtualnej klasy bazowej uruchamiany jest tylko raz
21. Mamy kawałek kodu, wska w odpowiedzi blok, który przechwyci rzucony wyj tek:
class A {};
class B { public: B(const A&) {}
B(const A) {} };
void fun() { throw A(); }
int main() {
try {
fun();
} catch (B&) {
// Blok 1
} catch (A&) {
// Blok 2
} catch (B) {
// Blok 3
} catch (A) {
// Blok 4
}
}
Odpowiedzi:
a. Blok 1
b.
Blok 2
c. Blok 3
d. Blok 4
22. Wska fałszywe zdanie: zgłoszenie wyj tku b d cego obiektem klasy jest mo liwe dla klasy, która
a. Posiada odpowiedni dost pny konstruktor i destruktor
b.
Nie alokuje danych na stercie
c. Nie jest klas abstrakcyjn
d. Posiada dost pny konstruktor kopiuj cy
23. Wska fałszywe zdanie: funkcja terminate() jest wołana gdy
a.
Konstruktor obiektu lokalnego rzuci wyj tek podczas obsługi wyj tku
b. Wyj tek zgłosi konstruktor obiektu globalnego
c. Rzucony wyj tek nie zostanie przechwycony na adnym poziomie
d. Wyj tek zgłosi destruktor obiektu statycznego
24. Tworzenie obiektu tylko na stercie umo ! liwia kod:
a.
class T { ~T(); public: T(); };
b. class T { void* operator new (size_t s); void operator delete(void* a); public: T(); };
c. class T { T(const T&); T& operator=(const T&); };
d. class T { T(); public: T(const T&); ~T(); };
25. W " ród czterech poni# szych rad wska$ jedn% fałszyw& :
a. Dziedzicz interfejsy, a nie implementacje
b. Nie konkretyzuj klas bazowych, najlepiej twórz je jako klasy abstrakcyjne
c.
Minimalizuj zale' no ( ci pomi) dzy klasami za pomoc* dziedziczenia
d. Je + li to mo , liwe twórz niewirtualne, stabilne interfejsy w klasach bazowych
5