plik


OpisProblemu ==================================================== Dana jest nastepujaca definicja zmiennych: int kk, &ll=kk, &mm=ll; KoniecOpisu Czy po wykonaniu nastepujacych operacji: kk=2; ll=5; mm=7; 1.Zmienna kk bedzie miala wartosc 7 ? TAK 2.Czy spelniony jest ponizszy warunek? &kk == &mm TAK 3.Przekazywanie parametru funkcji przez referencje, polega na tym, ze do funkcji przekazywany jest parametr, aktualny, a nie tylko jego wartosc. Dzieki temu zmiany wartosci parametru w funkcji sa widziane, rowniez na "zewnatrz" tej funkcji: TAK 4.Jako wynik funkcji wolno przekazywac referencje do zmiennych lokalnych tej funkcji, poniewaz zmienne te istnieja caly czas podczas dzialania danej funkcji: Nie 5.Czy funkcje przeciazone to funkcje majace wspolna sama nazwe (przy czym wielkosc liter jest nieistotna), lecz rozniace sie np. liczba parametrow lub typami parametrow? NIE 6.Czy prawdziwe jest stwierdzenie, ze w jezyku C++ mozna przeciazac funkcje, a nie mozna przeciazac operatorow arytmetycznych poza obrebem (definicji) danej klasy? NIE 7.Czy poprawna jest nastepujaca definicja przeciazenia operatora przesuniecia bitowego dla strumienia wyjsciowego. std::ostream &operator << ( std::ostream &strumien1, std::ostream &strumien2 ) { return strumien2; } TAK. 8.Czy hermetyzacja komponentow klasy (pol lub metod) ma na celu zabezpieczenie ich przed modyfikacja lub wywolaniem przez inne metody tej samej klasy? NIE 9.Czy metody prywatne (private) i chronione (protected) klasy dostepne sa dla funkcji zaprzyjaznionych z ta klasa? TAK 10.Czy dozwolona jest modyfikacja pol prywatnych danej klasy w funkcjach zaprzyjaznionych z ta klasa? TAK 11.Jezeli dla klasy "Telefon" nie zostal zdefiniowany zaden konstruktor, to czy definiujac zmienne w programie glownym tak jak jest to przedstawione ponizej: Telefon obTel; zostanie wywolany konstruktor kopiujacy? NIE 12.Czy jedna z operacji powodujacej niejawne wywolanie konstruktora danej klasy jest dynamiczna alokacja obiektu tejze klasy za pomoca operatora "new" ? TAK 13.Czy w przypadku obiektow definiowanych lokalnie (np. w metodzie lub funkcji) destruktory zawsze wywolywane sa niejawnie gdy sterowanie osiagnie koniec zakresu waznosci definicji danego obiektu? NIE Przyklad definiowania lokalnego obiektu "Suma": void Dodaj(LZespolona Z1, LZespolona Z2) { LZespolona Suma; ... } 14. Destruktor powinien miec taka sama, liste parametrow w wywolaniu jak konstruktor. Nie class LZespolona { private: double _re, _im; public: LZespolona() { _re = _im = 0;} }; 15.Czy klasa ta zawiera konstruktor kopiujacy (jawny lub niejawny, o ile taki moze istniec w tym przypadku).TAK 16.Czy konstruktor jest metoda skladowa klasy, ktora zawsze inicjalizuje pola tej klasy? TAK ??????? 17.Czy konstruktor ma taka sama nazwe jak nazwa klasy i moze byc wywolany jawnie jak kazda metoda. TAK 18.Czy konstruktor moze byc zadeklarowany w ponizszy sposob: class Klasa { Klasa(Klasa); public: }; NIE ??? 19.Czy przciazanie metod klasy jest mozliwe tylko poza sekcja chroniona (protected) danej klasy. NIE 20.Czy przciazanie metod klasy jest zabronione w przypadku destruktora. TAK 21.Czy przciazanie metod klasy wykorzystujace argumenty domyslne moze prowadzic do niejednoznacznosci, tzn. z zapisu wywolania metody bez znajomosci wartosci argumentow domyslnych nie bedzie mozna stwierdzic, ktora metoda bedzie wywolana? NIE?? OpisProblemu ==================================================== Niech bedzie dana definicja: int numer::funkcja(int i) { ... } 22.Czy prawda jest, ze moze to byc definicja metody klasy lub struktury lub tez unii o nazwie "numer"? NIE. 23.Czy prawda jest, ze jezeli jest to metoda klasy "numer", to jej definicja jest umieszczona na pewno poza blokiem definicji tej klasy? TAK ??? OpisProblemu ==================================================== Mamy zdefiniowana klase "Owoc" i jej klase pochodna "Jablko": class Owoc { int _Waga; public: Owoc(int a) { _Waga = a; }; }; class Jablko : public Owoc { public: int Oblicz(); }; Czy prawda jest, ze ... Jablko jab(2); KoniecOpisu 24. Obiekt "jab" nie bedzie mogl byc utworzony ze wzgledu na brak konstruktora parametrycznego w klasie "Jablko"? TAK 25. zapis jest poprawny i dziedziczone pole "_Waga" zostanie zainicjalizowane wartoscia 2? NIE 26. zapis definicji obiektu "jab" jest poprawny, jednak pole o nazwie "_Waga" klasy "Owoc" nie bedzie dostepne z poziomu metody klasy pochodnej ("Jablko")? NIE OpisProblemu ==================================================== Mamy zdefiniowana klase "PojazdKolowy" oraz zadefiniowany jest obiekt 'PojK': class PojazdKolowy { public: int _IloscKol; }; const PojazdKolowy PojK; Czy prawda jest, ze ... ... powyzsza definicja obiektu 'PojK' bylaby poprawna, gdyby w klasie zostal zdefiniowany konstruktor bezparametryczny, np. class PojazdKolowy { public: int _IloscKol; PojazdKolowy() {} }; KoniecOpisu OpisPytania ... obiekt nie jest inicjalizowany, tak wiec nie moze byc zadefiniowany jako staly. KoniecOpisu OpisPytania ... powyzsza definicja obiektu 'PojK' bylaby poprawna, gdyby w klasie zostal zdefiniowany konstruktor postaci: class PojazdKolowy { public: int _IloscKol; PojazdKolowy(int Wartosc) { _IloscKol = Wartosc; } }; KoniecOpisu OpisPytania ... powyzsza definicja obiektu 'PojK' bylaby poprawna, gdyby pole '_IloscKol' zostalo zdefiniowane jako statyczne, tzn.: class PojazdKolowy { public: static int _IloscKol; }; int PojazdKolowy::_IloscKol = 0; KoniecOpisu OpisPytania ... powyzsza definicja bylaby poprawna jesli odpowiednia instrukcja zainicjalizuje obiekt po jego utworzeniu zgodnie ze schematem, ktory jest stosowany, gdy nie jest uzywany modyfikator "const", tzn.: JakasKlasa Obiekt; jakas_instrukcja_inicjalizujaca_Obiekt; gdzie za napis "jakas_instrukcja_inicjalizujaca_Obiekt" trzeba podstawic odpowiednia instrukcje lub ciag instrukcji. KoniecOpisu OpisProblemu ==================================================== Mamy zdefiniowana klase "Ksiazka" oraz obiekt 'Ks': class Ksiazka { public: int _IloscStron; static int _IloscKsiazek; Ksiazka() {} }; int Ksiazka::_IloscKsiazek = 0; int main() { const Ksiazka Ks; Ks._IloscStron = 100; Ks._IloscKsiazek = 4; } Czy prawda jest, ze ... KoniecOpisu OpisPytania ... ze wzgledu na to, iz obiekt 'Ks' jest zdefiniowany jako staly, to obie operacje przypisania w funkcji 'main' sa niepoprawne. KoniecOpisu OpisPytania ... obie operacje przypisania w funkcji "main" mozna zrealizowac pod warunkiem wykonania rzutowania za pomoca operatora static_cast. KoniecOpisu OpisPytania ... operacja zmiany wartosci pola statycznego moze byc wykonana zawsze niezaleznie od tego czy obiekt jest staly czy nie. Jedynym warunkiem jest dostepnosc tego pola. KoniecOpisu OpisProblemu ==================================================== Mamy zdefiniowana klase "Telefon": class Telefon { public: int _Numer; }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... w klasie tej istnieje konstruktor bezparametryczny. KoniecOpisu OpisProblemu ==================================================== Mamy zdefiniowana klase "Telefon": class Telefon { public: int _Numer; }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... mozna utworzyc obiekt tej klasy wywolujac konstruktor bezparametryczny. KoniecOpisu OpisProblemu ==================================================== Mamy zdefiniowana klase "FiguraGeom": class FiguraGeom { public: double _Obwod; FiguraGeom(): _Obwod() {} }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... w tej klasie zdefiniowanie konstruktora bezparametrycznego powoduje uniewaznienie automatycznie generowanego konstruktora kopiujacego. KoniecOpisu OpisPytania ... w tej klasie bezposrednio po utworzeniu obiektu jego pole "_Obwod" bedzie ono mialo zawsze wartosc 0, o ile zostanie uzyty konstruktor bezparametryczny. W innym przypadku juz tak byc nie musi. KoniecOpisu OpisPytania ... w tej klasie bezposrednio po utworzeniu obiektu jego pole "_Obwod" bedzie mialo wartosc 0 po kazdorazowym utworzeniu obiektu z wykorzystaniem konstruktora bezparametrycznego. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dana definicja klasy: struct LiczbaZespolona { float _Re, _Im; public: float Re() const { return _Re; } float& Re() { return _Re; } float Im() const { return _Im; } float& Im() { return _Im; } }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... metody "Re()" oraz "Im()" nie sa przeciazone, gdyz zwracaja rozny typ wartosci. KoniecOpisu OpisPytania ... niezaleznie od sposobu utworznia obiektu tej klasy nie mozna zmienic jego zawartosci. KoniecOpisu OpisPytania ... dla kodu przedstawionego ponizej zostanie wywolana metoda "float LiczbaZespolona::Re() const". float Odczyt(LiczbaZespolona& Z) { cout << Z.Re(); } KoniecOpisu OpisPytania ... w funkcji ponizej tworzy sie obiekt staly, ktory jest inicjalizowany wartoscia parametru wywolania tej funkcji. float Odczyt(const LiczbaZespolona Z) { cout << Z.Re(); } KoniecOpisu OpisProblemu ==================================================== Niech bedzie dana definicja klasy oraz zapowiedz definicji funkcji: class KlasaLiczby { float _Liczba; public: float PobierzLiczbe() const { return _Liczba; } float& PobierzLiczbe() { return _Liczba; } }; void Dzialaj(const KlasaLiczby Lx); Czy prawda jest, ze ... KoniecOpisu OpisPytania ... dla wywolania: int main() { KlasaLiczby Li; Dzialaj(Li); } Zawartosc obiektu "Li" na pewno nie ulegnie zmianie, gdyz w zapowiedzi definicji funkcji znajduje sie modyfikator "const". Bez niego nie ma juz takiej gwarancji KoniecOpisu OpisPytania ... dla wywolania: int main() { KlasaLiczby Li; Dzialaj(Li); } Zawartosc obiektu "Li" na pewno nie ulegnie zmianie, gdyz obiek przkazywany jest do funkcji poprzez wartosc. KoniecOpisu OpisPytania ... dla wywolania: int main() { KlasaLiczby Li; Dzialaj(Li); } W trakcie wywolania funkcji obiekt "Li" jest kopiowany. KoniecOpisu OpisPytania ... dla wywolania: int main() { KlasaLiczby Li; Dzialaj(Li); } Wartosc obiektu "Li" nie ulega zmianie. Ponadto tworzona jest jego kopia, ktora moze byc modyfikowana wewnatrz funkcji "Dzialaj" bez jakichkololwiek rzutowan. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dana definicja klasy oraz zapowiedz definicji funkcji: class KlasaLiczby { float _Liczba; public: float PobierzLiczbe() const { return _Liczba; } float& PobierzLiczbe() { return _Liczba; } }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... rownowazna definicja tej klasy jest: struct KlasaLiczby { float _Liczba; private: float PobierzLiczbe() const { return _Liczba; } float& PobierzLiczbe() { return _Liczba; } }; KoniecOpisu OpisPytania ... rownowazna definicja tej klasy jest: struct KlasaLiczby { float PobierzLiczbe() const { return _Liczba; } private: float _Liczba; public: float& PobierzLiczbe() { return _Liczba; } }; KoniecOpisu OpisPytania ... rownowazna definicja tej klasy jest: class KlasaLiczby { public: float PobierzLiczbe() const { return _Liczba; } float& PobierzLiczbe() { return _Liczba; } private: float _Liczba; }; KoniecOpisu OpisPytania ... rownowazna definicja tej klasy jest: struct KlasaLiczby { float PobierzLiczbe() const { return _Liczba; } float& PobierzLiczbe() { return _Liczba; } float _Liczba; }; KoniecOpisu OpisProblemu ==================================================== Niech bedzie dana definicja klasy class Wektor { protected: float _x, _y; public: Wektor(float x, float y) { _x = x; _y = y; } Wektor Dodaj(const Wektor& W) const; }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... jedna z roznic miedzy sekcja "private", a "protected" polega na tym, ze w przypadku wystapienia w definicji klasy Wektor sekcji "private" zamiast "protected" ponizsza definicja metody nie zawsze bylaby poprawna: Wektor Wektor::Dodaj(const Wektor& W) const { return Wektor(_x + W._x, _y + W._y); } KoniecOpisu OpisPytania ... rownowazna definicja klasy "Wektor" jest: class Wektor { float _x, _y; public: Wektor(float x, float y) { _x = x; _y = y; } Wektor Dodaj(const Wektor& W) const; }; KoniecOpisu OpisPytania ... w definicji metody "Dodaj", przedstawionej ponizej, mozna odwolywac sie do pol chronionych innych obiektow tej samej klasy. Jest to prawdziwe dla dowolnej metody, ktora zdefiniowana bylaby dla klasy "Wektor". Wektor Wektor::Dodaj(const Wektor& W) const { return Wektor(_x + W._x, _y + W._y); } KoniecOpisu OpisPytania ... sekcja "protected" nie ma zadnego znaczenia, gdy w metodach odwolujemy sie do pol, ktore wraz z metodami sa elementami definicji tej samej klasy. Przykladem moze byc odwolanie sie do pol prywatnych "_x" i "_y" w konstruktorze klasy "Wektor". KoniecOpisu OpisProblemu ==================================================== Niech bedzie dana definicja klasy oraz definicja pola statycznego: class KlasaLiczby { protected: static int _IloscLiczb; public: int _Liczba; KlasaLiczby(): _Liczba() { ++_IloscLiczb; } ~KlasaLiczby() { --_IloscLiczb; } }; int KlasaLiczby::_IloscLiczb; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... bezposrednio po utworzeniu obiektu klasy "KlasaLiczby" pola "_IloscLiczb" i "_Liczba" beda mialy zawsze rozne wartosci. KoniecOpisu OpisPytania ... dodanie nowego pola statycznego moze prowadzic do zwiekszenia rozmiaru obiektu. KoniecOpisu OpisPytania ... w konstruktorze nie jest inicjalizowane pole "_Liczba". Moze wiec sie zdarzyc, ze jego wartosc bezposrednio po utworzeniu obiektu bedzie dowolna. Aczkolwiek zazwyczaj bedzie to wartosc 0. KoniecOpisu OpisPytania ... w tym przypadku pole statyczne "_IloscLiczb" jest niejawnie inicjalizowane ta sama wartoscia jak pole "_Liczba". KoniecOpisu OpisProblemu ==================================================== Niech bedzie dana definicja klas i zapowiedz definicji funkcji: class FiguraGeometryczna { protected: float _WsplrzednaSrodka_x, _WsplrzednaSrodka_y; }; class Kwadrat: public FiguraGeometryczna { public: float _RozmiarBoku; }; void Dzialaj( FiguraGeometryczna Fig ); Czy prawda jest, ze ... KoniecOpisu OpisPytania ... wywolanie funkcji przedstawione ponizej int main() { Kwadrat Kw; Dzialaj(Kw); } moze byc nieprawidlowe, choc nie zawsze to zasygnalizuje kompilator. Powodem sa rozne typy obiektu i parametru formalnego. KoniecOpisu OpisPytania ... wywolanie funkcji przedstawione ponizej int main() { Kwadrat Kw; Dzialaj(Kw); } niezaleznie od definicji funkcji "Dzialaj" nigdy nie spowoduje ona zadnych zmian w obiekcie "Kw". KoniecOpisu OpisPytania ... wywolanie funkcji przedstawione ponizej int main() { Kwadrat Kw; Dzialaj(Kw); } do funkcji "Dzialaj" przekazywana jest kopia podobiektu klasy "FiguraGeomtryczna", ktory zawarty jest w obiekcie "Kw". KoniecOpisu OpisPytania ... wywolanie funkcji przedstawione ponizej int main() { Kwadrat Kw; Dzialaj(Kw); } w zaleznosci od definicji funkcji "Dzialaj" mozna odwolac sie do obiektu "Kw" wewnatrz tej funkcji, choc nie bedzie go mozna zmienic. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dana definicja klasy oraz definicja przeciazenia operatora podstawienia: class Liczba { public: Liczba() { _wLiczba = new float; } ~Liczba() { delete _wLiczba; } Liczba& operator = (const Liczba& L); private: float *_wLiczba; }; Liczba& Liczba::operator = (const Liczba& L) { *_wLiczba = *L._wLiczba; return *this; } Czy prawda jest, ze ... KoniecOpisu OpisPytania ... dla kodu przedstawionego ponizej int main() { Liczba L1; Liczba L2 = L1; } operacja przypisania wartosci L1 do L2 zostanie wykonana poprawnie dzieki przeciazeniu operatora "=". Niemniej uzycie niektorych kompilatorow, moze powodowac bledne wykonanie programu. KoniecOpisu OpisPytania ... dla kodu przedstawionego ponizej int main() { Liczba *wL = new Liczba; Liczba L1 = *wL; } operacja tworzenia obiektu L1 nie wykorzystuje konstruktora bezparametrycznego, ani tez przeciazenia operatora "=". KoniecOpisu OpisPytania ... dla kodu przedstawionego ponizej int main() { Liczba *wL = new Liczba; Liczba L1 = *wL; } przedstawiona konstrukcja jest prawidlowa i destrukcja obu obiektow przebiegnie bez zadnych bledow, tzn. destruktory obu obiektow wykonaja sie prawidlowo. Byloby jednak lepiej, aby jawnie usuwac obiekt *wL poprzez uzycie operatora "delete", tzn. delete wL; KoniecOpisu OpisPytania ... konstrukcja klasy nie zapewnia poprawnego dzialania programu w przypadku poslugiwania sie funkcjami z parametrami klasy "Liczba" przekazywanymi przez wartosc, np. void Dzialaj( Liczba L ) { ... } KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu class Klasa { int _Kod; public: const Klasa& Metoda1() const { return *this; } Klasa& Metoda2() { return *this; } const Klasa& Metoda3() { return *this; } }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... ze ponizszy ciag wywolan int main() { Klasa Ob; Ob.Metoda1().Metoda2().Metoda3(); } jest niepoprawny, gdyz metode mozna wywolywac tylko dla obiektu, a nie wyniku zwracanego przez inna metode. KoniecOpisu OpisPytania ... ze ponizszy ciag wywolan int main() { Klasa Ob1; const Klasa Ob2; Ob2 = Ob1.Metoda2(); } doprowadzi do sytuacji, ze w zmiennej "Ob2" znajdzie sie obiekt, ktory bedzie modyfikowalny. KoniecOpisu OpisPytania ... ze dla ponizszego ciagu wywolan int main() { Klasa Ob; const Klasa &Ref_Ob = Ob; Ref_Ob.Metoda1(); Ob.Metoda2(); } zarowno "Metoda1" jak tez "Metoda2" zwraca referencje do tego samego obiektu. KoniecOpisu OpisPytania ... ze dla ponizszego ciagu wywolan int main() { Klasa Ob1; Klasa Ob2; Ob1.Metoda2() = Ob2.Metoda1(); } po wykonaniu tej operacji zawartosc obu obiektow bedzie jednakowa. KoniecOpisu OpisPytania ... ze dla ponizszego ciagu wywolan int main() { Klasa Ob1; Klasa Ob2; Ob2.Metoda1() = Ob1.Metoda2(); } po wykonaniu tej operacji zawartosc obu obiektow bedzie jednakowa. KoniecOpisu OpisPytania ... ze ponizszy ciag wywolan int main() { Klasa Ob; Ob.Metoda1().Metoda2().Metoda3(); } jest niepoprawny, gdyz metode modyfikujaca obiekt mozna wywolywac tylko dla obiektu modyfikowalnego. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu int main() { try { throw std::cout; } catch (std::ostream& OStrm) { cout << "Obsluga: 1" << endl; } catch (std::istream& OStrm) { cout << "Obsluga: 2" << endl; } } Czy prawda jest, ze ... KoniecOpisu OpisPytania ... zapis jest niepoprawny, gdyz nie mozna zglaszac jako wyjatkow obiektow z biblioteki standardowej. KoniecOpisu OpisPytania ... zapis jest niepoprawny, gdyz strumieni nie mozna przekazywac do metod poprzez wartosc. KoniecOpisu OpisPytania ... zapis jest niepoprawny, gdyz jako wyjatku nie mozna zglaszac w jakiejkolwiek formie strumienia standardowego, tzn. bezposrednio jako obiekt lub posrednio poprzez zmienne referencjna lub wskaznik. KoniecOpisu OpisPytania ... mozliwa jest modyfikacja zgloszenia obiektu std::cout bez wprowadzania dodatkowych definicji klas, tak aby ktoras z istniejacych sekcji "catch" przechwycila go. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu class FiguraGeometryczna { public: double _Pole; }; class Kwadrat: public FiguraGeometryczna { public: double _DlugoscBoku; }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... w przedstawionym ponizej zapisie wystepuje niejawne rzutowanie "w gore". int main() { Kwadrat Kw; FiguraGeometryczna *wFig = &Kw; } KoniecOpisu OpisPytania ... w przedstawionym ponizej zapisie wystepuje niejawne rzutowanie "w dol". int main() { Kwadrat Kw; FiguraGeometryczna *wFig = &Kw; } KoniecOpisu OpisPytania ... w przedstawionym ponizej zapisie wystepuje niejawne rzutowanie "w dol". int main() { FiguraGeometryczna Fig; Kwadrat *wKw = &Fig; } KoniecOpisu OpisPytania ... w przedstawionym ponizej zapisie wystepuje niejawne rzutowanie "w gore". int main() { FiguraGeometryczna Fig; Kwadrat *wKw = &Fig; } KoniecOpisu OpisPytania ... w przedstawionym ponizej zapisie poprzez zmienna "Fig" mamy dostep do podobiektu znawartego w obiekcie "Kw". int main() { Kwadrat Kw; FiguraGeometryczna &Fig = Kw; } KoniecOpisu OpisPytania ... w przedstawionym ponizej zapisie poprzez zmienna "Fig" mamy dostep do podobiektu zawartego w obiekcie "Kw". Pozwala to modyfikowac zawartosc obiektu "Kw" poprzez zmiany w obiekcie "Fig". int main() { Kwadrat Kw; FiguraGeometryczna Fig = Kw; } KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu class FiguraGeometryczna { public: double _Pole; double ObliczPole() { return _Pole; } }; class Kwadrat: public FiguraGeometryczna { public: double _DlugoscBoku; double ObliczPole(double Skala) { return pow(Skala*_DlugoscBoku,2); } }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... ponizszy zapis jest nieprawidlowy i nie ma sposobu, aby nie modyfikujac definicji klas i dysponujac obiektem "Kw" odwolac sie do metody "ObliczPole()" z klasy "FiguraGeometryczna". int main() { Kwadrat Kw; Kw.ObliczPole(); } KoniecOpisu OpisPytania ... ponizszy zapis jest nieprawidlowy. Dysponujac referencja "Fig" do obiektu klasy "FiguraGeometryczna" i nie dokonujac zadnych rzutowan mozna odwolac sie tylko do metody "ObliczPole()", a nie "ObliczPole(double)". int main() { Kwadrat Kw; FiguraGeometryczna &Fig = Kw; Fig.ObliczPole(1.0); } KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu class FiguraGeometryczna { double _Pole; public: double ObliczPole() { return _Pole; } }; class Kwadrat: private FiguraGeometryczna { double _DlugoscBoku; public: double ObliczPole(double Skala) { return pow(Skala*_DlugoscBoku,2); } }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... ponizszy zapis jest nieprawidlowy i nie ma sposobu, aby dysponujac obiektem "Kw" odwolac sie do metody "ObliczPole()" z klasy "FiguraGeometryczna". int main() { Kwadrat Kw; Kw.ObliczPole(); } KoniecOpisu OpisPytania ... ponizszy zapis jest nieprawidlowy, chociaz rzutowanie niejawne na referencje do podobiektu klasy "FiguraGeometryczna" jest poprawne. int main() { Kwadrat Kw; FiguraGeometryczna &Fig = Kw; Fig.ObliczPole(); } KoniecOpisu OpisPytania ... ponizszy zapis jest nieprawidlowy. Jednym z powodow jest to, ze ze wzgledu na dziedziczenie, gdy dysponujemy referencja "Fig" mozemy odwolac sie tylko do metody "ObliczPole(double)". int main() { Kwadrat Kw; FiguraGeometryczna &Fig = Kw; Fig.ObliczPole(); } KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu class FiguraGeometryczna { private: double _Pole; double ObliczPole() { return _Pole; } public: }; class Kwadrat: public FiguraGeometryczna { private: double _DlugoscBoku; public: double ObliczPole(double Skala) { return pow(Skala*_DlugoscBoku,2); } }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... ponizszy zapis jest nieprawidlowy i nie ma sposobu, aby dysponujac obiektem klasy "Kwadrat" odwolac sie do metody "ObliczPole()" z klasy "FiguraGeometryczna". int main() { Kwadrat Kw; Kw.ObliczPole(); } KoniecOpisu OpisPytania ... ponizszy zapis jest nieprawidlowy. Dysponujac referencja "Fig" do obiektu klasy "FiguraGeometryczna" i dokonujac rzutowan mozna odwolac sie tylko do metody "ObliczPole(double)", a nie "ObliczPole()". int main() { Kwadrat Kw; FiguraGeometryczna &Fig = Kw; Fig.ObliczPole(); } KoniecOpisu OpisPytania ... ponizszy zapis jest nieprawidlowy. Dysponujac referencja do obiektu klasy "FiguraGeometryczna" i nie dokonujac zadnych rzutowan mozna odwolac sie tylko do metody "ObliczPole()", a nie "ObliczPole(double)". int main() { Kwadrat Kw; FiguraGeometryczna &Fig = Kw; Fig.ObliczPole(1.0); } KoniecOpisu OpisProblemu ==================================================== Niech beda dane prototypy dwoch funkcji: void Wylicz( float Param1, double Param2 ); void Wylicz( double Param1, float Param2 ); Zakladajac, ze w programie znajduja sie poprawne ich definicje i ze nie ma innego przeciazenia funcji "Wylicz", czy prawda jest, ze ... KoniecOpisu OpisPytania ... w funkcji main przedstawionej ponizej: int main() { Wylicz(1.2, 'c'); } na ogol zostanie wywolana druga z przedstawionych funkcji, tzn. Wylicz( double Param1, float Param2 ); Zalezy to jednak od kompilatora i od domyslnej interpretacji uzytej w liscie parametrow stalej liczbowej. KoniecOpisu OpisPytania ... w funkcji main przedstawionej ponizej: enum PoryRoku { Wiosna, Lato, Jesien, Zima }; int main() { Wylicz( Wiosna , 1.2); } zostanie wywolana pierwsza z przedstawionych funkcji, tzn. Wylicz( float Param1, double Param2 ); O wywolaniu tej funkcji decyduje uzyta stala liczbowa. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu class FiguraGeometryczna { double _PolePowierzchni; public: double& UzyjPole() { return _PolePowierzchni; } }; class Kwadrat: public FiguraGeometryczna { double _DlugoscBoku; public: Kwadrat& ZmienDlugosc(double Dl) { _DlugoscBoku = Dl; return *this; } FiguraGeometryczna& UzyjFigure() { return *this; } }; Czy prawda jest, ze ... KoniecOpisu OpisPytania ... przedstawiony ponizej kod programu jest poprawny i nigdy nie spowoduje bledu wykonania programu (np. niedozwolony dostep do pamieci). int main() { Kwadrat Kw; FiguraGeometryczna Fig; Kw.ZmienDlugosc(10).UzyjFigure().UzyjPole() = 5; } KoniecOpisu OpisPytania ... przedstawiony ponizej kod programu jest poprawny i nigdy nie spowoduje bledu wykonania programu (np. niedozwolony dostep do pamieci). int main() { Kwadrat Kw; FiguraGeometryczna Fig; Kw.ZmienDlugosc(10).UzyjPole().UzyjFigure() = 5; } KoniecOpisu OpisPytania ... przedstawiony ponizej kod programu moze (ale nie musi) spowodowac zmiane zawartosci obiektu "Fig". int main() { Kwadrat Kw; FiguraGeometryczna Fig; Kw.ZmienDlugosc(10).UzyjFigure().UzyjPole() = 5; } KoniecOpisu OpisPytania ... przedstawiony ponizej kod programu nigdy nie spowoduje zmiany zawartosci obiektu "Fig". int main() { Kwadrat Kw; FiguraGeometryczna Fig; Kw.ZmienDlugosc(10).UzyjFigure().UzyjPole() = 5; } KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu #include #include #include #include int main() { } Czy prawda jest, ze ... KoniecOpisu OpisPytania ... zapis #include powoduje, ze do programu dolaczany jest plik naglowkowy "cmath", ktory NIE moze byc uzyty w przypadku programow pisanych w jezyku C. KoniecOpisu OpisPytania ... zapis #include powoduje, ze do programu zawsze dolaczany jest plik naglowkowy "math.h" KoniecOpisu OpisPytania ... zapis #include odpowiada dolaczeniu pliku "type.h" gdy program pisany jest w jezyku C. Charakterystyczna cecha nazw odpowiednikow plikow z jezyka C jest dolaczenie na poczatku dwoch literek 'c'. KoniecOpisu OpisPytania ... zapis #include odpowiada dolaczeniu pliku "string". Plik ten NIE jest odpowiednikiem pliku naglowkowego "string.h" stosowanego w programach pisanych w jezyku C. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu struct Pojazd { virtual void Wyswietl() const { cout << "Pojazd" << endl; } }; struct Dzwig { virtual void Wyswietl() const { cout << "Dzwig" << endl; } }; struct DzwigSamobiezny: public Pojazd, public Dzwig { void Wyswietl() const { cout << "DzwigSamobiezny" << endl; } }; Zakladamy, ze powyzszy kod jest umieszczony we wlasciwym kontekscie i kompiluje sie bez ostrzezen. Czy prawda jest, ze ... KoniecOpisu OpisPytania ... jest to przyklad dziedziczena wielobazowego. Wystepowanie metod wirtualnych nie ma zadnego znaczenia dla okreslenia typu dziedziczenia, tzn. czy jest to dziedziczenie jednobazowe czy tez wielobazowe. KoniecOpisu OpisPytania ... metoda "Wyswietl()" w klasie "DzwigSamobiezny" jest metoda wirtualna. KoniecOpisu OpisPytania ... w przypadku kodu funkcji "main()": int main() { DzwigSamobiezny oDzwigSam; Pojazd &oPojazd = oDzwigSam; Dzwig &oDzwig = oDzwigSam; oPojazd.Wyswietl(); oDzwig.Wyswietl(); } Dla kazdej z referencji (tzn. "oPojazd" i "oDzwigSam") wywolaja sie rozne metody "Wyswietl()". KoniecOpisu OpisProblemu ==================================================== Niech bedzie dana definicja klasy i zapowiedz definicji funkcji: struct Wektor { float x, y; }; void Dzialanie(const Wektor& W); Zakladamy, ze powyzszy kod jest umieszczony we wlasciwym kontekscie i kompiluje sie bez ostrzezen. Czy prawda jest, ze ... KoniecOpisu OpisPytania ... wywolanie funkcji "Dzialanie" w ponizszym kodzie int main() { Wektor Wekt; Dzialanie(Wekt); } spowoduje uruchomienie konstruktora kopiujacego dla obiektu "Wekt". KoniecOpisu OpisPytania ... wywolanie funkcji "Dzialanie" w ponizszym kodzie int main() { Wektor Wekt; Dzialanie(Wekt); } nie daje gwarancji, ze obiekt "Wekt" nie zostanie zmodyfikowany, gdyz w funkcji "Dzialanie" moga byc np. rzutowania. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu struct FiguraGeometryczna { virtual float ObliczPole() const { return 0; } private: int _Identyfikator; }; struct Pojazd { virtual float PojemnoscSilnika() const { return 0; } virtual const char* MarkaPojazdu() const { return "Klasa bazowa"; } private: int _Identyfikator; }; Zakladamy, ze powyzszy kod jest umieszczony we wlasciwym kontekscie i kompiluje sie bez ostrzezen. Czy prawda jest, ze ... KoniecOpisu OpisPytania ... rozmiar obiektow klasy "FiguraGeometryczna" i klasy "Pojazd" jest taki sam. Na rozmiar obiektow tych klas ma wplyw wystepowanie metod wirtualnych, tzn. czy w danej klasie wystepuje jakakolwiek metoda wirtualna, czy tez nie ma ich w ogole. KoniecOpisu OpisPytania ... rozmiar obiektow klasy "FiguraGeometryczna" i "Pojazd" jest zalezny od ilosci wystepujacych w nich metod wirtualnych. Zakladamy, ze obie klasy maja co najmniej jedna metode wirtualna. KoniecOpisu OpisPytania ... rozmiar obiektow zarowno klasy "FiguraGeometryczna", jak tez klasy "Pojazd" jest rowny sumie rozmiarow pol, ktore wystepuja w danym obiekcie. W tym przypadku jest to rozmiar pola "_Identyfikator". Rozmiar obiektow nie zalezy od ilosci metod, ktore dana klasa posiada. Zakladamy, ze obie klasy maja co najmniej jedna metode wirtualna. KoniecOpisu OpisPytania ... ilosc metod wirtualnych moze miec wplyw na rozmiar tablicy VTABLE (tablica adresow metod wirtualnych). Mimo to rozmiar obiektow obu klas bedzie rowny. Zakladamy, ze obie klasy maja co najmniej jedna metode wirtualna. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu struct FiguraGeometryczna { float ObliczPole() const { return 0; } private: int _Identyfikator; }; struct Pojazd { float PojemnoscSilnika() const { return 0; } const char* MarkaPojazdu() const { return "Pojazd"; } private: int _Identyfikator; }; Zakladamy, ze powyzszy kod jest umieszczony we wlasciwym kontekscie i kompiluje sie bez ostrzezen. Czy prawda jest, ze ... KoniecOpisu OpisPytania ... rozmiar obiektow klasy "FiguraGeometryczna" i "Pojazd" jest rowny. Moze sie jednak zmienic, gdy dopisane zostana definicje konstruktorow. KoniecOpisu OpisPytania ... rozmiar obiektow klas "FiguraGeometryczna" i "Pojazd" nie zalezy od ilosci metod zdefiniowanych w tych klasach. Zakladamy, ze nie sa to metody wirtualne. Moga to jednak byc metody z modyfikatorem "const" jakt tez bez niego. KoniecOpisu OpisPytania ... rozmiar obiektow klas "FiguraGeometryczna" i "Pojazd" zalezy od sposobu zdefiniowania metod, tzn. bedzie inny, gdy pelna definicja metody znajdzie sie poza cialem klasy. W przedstawionym przypadku metody beda rozwijane "w linii". KoniecOpisu OpisPytania ... rozmiar obiektow klas "FiguraGeometryczna" i "Pojazd" jest zdeterminowany tylko i wylacznie rozmiarem pol znajdujacych sie w klasie i nie zalezy od ich nazwy. W tym przypadku chodzi o pola "_Identyfikator". KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu struct FiguraGeometryczna { virtual float ObliczPole() const { return 0; } }; struct Kwadrat: public FiguraGeometryczna { virtual float ObliczPole() const { return _DlugoscBoku*_DlugoscBoku; } virtual ~Kwadrat() {} protected: float _DlugoscBoku; }; Zakladamy, ze powyzszy kod jest umieszczony we wlasciwym kontekscie i kompiluje sie bez ostrzezen. Czy prawda jest, ze ... KoniecOpisu OpisPytania ... operacja przedstawiona ponizej jest poprawna i nie spowoduje blednego dzialania programu. FiguraGeometryczna *wFig = new Kwadrat(); delete wFig; KoniecOpisu OpisPytania ... dla zmiennej wskaznikowej typu FiguraGeometryczna*, ktora wskazuje na obiekt lub podobiekt zawarty w innym obiekcie w sensie dziedziczenia zgodnie z prezentowana definicja klasy Kwadrat, wykonanie operacji: Pole = wFig->ObliczPole(); moze spowodowac, ze w zmiennej "Pole" bedzie wartosc rozna od 0. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu struct Wektor { float x, y; Wektor() { x = y = 0; } const float Norma() { return sqrt(x*x+y*y); } }; Zakladamy, ze powyzszy kod jest umieszczony we wlasciwym kontekscie i kompiluje sie bez ostrzezen. Czy prawda jest, ze ... KoniecOpisu OpisPytania ... uzycie modyfikatora "const" w metodzie "Norma" na jej poczatku informuje o tym, ze metoda bedzie mogla zostac wywolana dla obiektow stalych, tzn. const Wektor W; W.Norma(); KoniecOpisu OpisPytania ... przedstawione ponizej podstawienie jest poprawne i pomimo tego, ze metoda "Norma" zwraca stala wartosc, to wartosc zmiennej "Dlugosc" moze byc zmieniana. const Wektor W; float Dlugosc = W.Norma(); KoniecOpisu OpisProblemu ==================================================== Niech bedzie dany nastepujacy fragment kodu struct Wektor { float x, y; inline float Norma() const { return sqrt(x*x+y*y); } }; Zakladamy, ze powyzszy kod jest umieszczony we wlasciwym kontekscie i kompiluje sie bez ostrzezen. Czy prawda jest, ze ... KoniecOpisu OpisPytania ... gdy kod metody jest rozwijany "w linii", to wielkosc obiektu tej klasy bedzie mniejsza niz w przypadku, gdy klasa ta zostanie zdefiniowana bez tej metody. KoniecOpisu OpisPytania mozna pominac modyfikator "inline". Ta metoda i tak bedzie traktowana jako metoda "inline", choc nie zawsze jej kod musi zostac rowiniety "w linii". KoniecOpisu OpisProblemu ==================================================== W przypadku definiowania metod wirtualnych generowane sa przez kompilator dodatkowe zestawy danych, ktore umozliwiaja realizacje w praktyce idei polimorfizmu (wielopostaciowosci). Jezeli w danym programie zdefiniowane sa WYLACZNIE klasy z metodami wirtualnymi, to czy prawdziwe jest nastepujace stwierdzenie? KoniecOpisu OpisPytania Po uruchomieniu takiego programu, tworzone sa tablice metod wirtualnych. Tablice te sa tworzone w sposob dynamiczny osobno dla kazdego obiektu. Dzieki temu z kazdym obiektem skojarzona jest unikalna tablica metod wirtualnych. KoniecOpisu OpisPytania Obiekty klas, posiadaja w sposob niejawny wbudowany dodatkowy wskaznik, ktory jest wskaznikiem na tablice metod wirtualnych. Tablica taka ma zawsze taki sam zestaw adresow metod wirtualnych dla kazdego obiektu danej klasy. KoniecOpisu OpisPytania Zawsze z obiektem klasy skojarzony jest wskaznik na tablice metod wirtualnych. Wskaznik ten nie jest jawnie dostepny i nie ma mozliwosci odczytania adresu tablicy. Gdyby byla taka mozliwosc, to mogloby to skutkowac proba dostepu i modyfikacji obszaru pamieci, ktory nie moze byc modyfikowany. KoniecOpisu OpisPytania Istnienie w obiekcie adresu do tablicy metod wirtualnych pozwala na rozroznienie przypadku, gdy obiekt zostal utworzony jako samodzielna odrebna calosc, np. poprzez definicje: FiguraGeometryczna Fig; czy tez jest elementem skladowym innego obiektu. KoniecOpisu OpisProblemu ==================================================== Niech beda dane nastepujace definicje klas: class Tablica { protected: float *_wTab; int _Rozmiar; public: Tablica(int Rozmiar): _Rozmiar(Rozmiar) { _wTab = new float[_Rozmiar]; } virtual float operator [] ( int Indeks ) const { return _wTab[Indeks]; } }; class TablicaPochodna: public Tablica { public: TablicaPochodna(int Rozmiar): Tablica(Rozmiar) {} float& operator [] ( int Indeks ) { return _wTab[Indeks]; } }; Zakladamy, ze powyzszy kod jest umieszczony we wlasciwym kontekscie i kompiluje sie bez zadnych ostrzezen. Czy prawda jest, ze ... KoniecOpisu OpisPytania w przypadku ponizej definicji funkcji main: int main() { TablicaPochodna Tab(2); cout << Tab[1] << endl; } ze wzgledu na to, ze zawartosc obiektu "Tab" jest tylko odczytywana, to zostanie wywolane przeciazenie operatora indeksujacego "[]" zdefiniowane w klasie "Tablica". Przeciazenie to jest dziedziczone przez klase "TablicaPochodna". KoniecOpisu OpisPytania w przypadku ponizej definicji funkcji main: int main() { Tablica &Tab = TablicaPochodna(2); Tab[1] = 1; } nie mozna wykonac podstawienia "Tab[1] = 1", gdyz klasa "Tablica" dysponuje przeciazeniem operatora indeksujacego, ktory nie daje mozliwosci modyfikacji obiektu. Fakt, ze jest to wirtualna metoda operatorowa nie ma tu zadnego znaczenia. KoniecOpisu OpisPytania w przypadku ponizej definicji funkcji main: int main() { const TablicaPochodna Tab[2]; Tab[1]; } Ze wzgledu na to, ze zdefiniowany obiekt "Tab" jest staly, to wywolanie operatora indeksujacego spowoduje uruchomienie jego przeciazenia, ktore jest zdefiniowane w klasie "Tablica" dziedziczonej przez klase "TablicaPochodna". KoniecOpisu OpisPytania w przypadku ponizej definicji funkcji main: int main() { Tablica &Tab = TablicaPochodna(2); ... } Samodzielny obiekt klasy "Tablica" nie da sie zmodyfikowac po jego utworzeniu. W tym jednak przypadku dysponujac referencja do obiektu "Tab" mozna to zrobic, poprzez odpowiednie rzutowanie. KoniecOpisu OpisProblemu ==================================================== Niech bedzie dana nastepujaca definicja klasy: class LZespolona { public: float re, im; LZespolona( float re, float im ); LZespolona( float re ); }; Zakladamy, ze powyzszy kod jest umieszczony we wlasciwym kontekscie i kompiluje sie bez zadnych ostrzezen. Czy prawda jest, ze ... KoniecOpisu OpisPytania Definicja konstruktora w postaci: LZespolona::LZespolona( float re, float im ): re(re), im(im) {} aczkolwiek skompiluje sie poprawnie, to wartosci pol klasy nie zostana zainicjalizowane, gdyz nazwy parametrow przeslaniaja nazwy pol klasy. KoniecOpisu OpisPytania Definicja konstruktora w postaci: LZespolona::LZespolona( float re, float im ) { re = re; im = im; } aczkolwiek skompiluje sie poprawnie, to wartosci pol klasy nie zostana zainicjalizowane, gdyz nazwy parametrow przeslaniaja nazwy pol klasy. KoniecOpisu OpisPytania Definicja konstruktora w postaci: LZespolona::LZespolona( float re ): im() { LZespolona::re = re; } jest prawidlowa i gwarantuje jednoznaczne zainicjalizowanie obu pol klasy. KoniecOpisu OpisPytania Definicja konstruktora w postaci: LZespolona::LZespolona( float re ): im() { re = LZespolona::re; } jest prawidlowa i gwarantuje jednoznaczne zainicjalizowanie obu pol klasy. KoniecOpisu OpisPytania Definicja konstruktora w postaci: LZespolona::LZespolona( float re ): re(re), im() {} nie gwarantuje poprawnej inicjalizacji pol klasy. Zapis nie jest jednoznaczny i nie mozna okreslic jakimi wartosciami zostana zainicjalizowane pola klasy. KoniecOpisu

Wyszukiwarka

Podobne podstrony:
Religia Pytania o latarnię mojego serca
Pytania z witamin Siemian
pytania2009cz1 test
PKC pytania na egzamin
2009 pytania testowe
pytania byrdy I termin
patomorfologia pytania egzamin opisowy
PIK PYTANIA
pytania
pytania rynek finansowy egzamin
examin C inne pytania 2
Betony pytania
Marketing Opracowane Pytania Egzaminacyjne 2009 Furtak (46)

więcej podobnych podstron