Pytania pomocnicze - INF.04
Projektowanie, programowanie i testowanie aplikacji
Pytania pomocnicze rozwijające tematy z pytań egzaminacyjnych. Każde pytanie ma krótką odpowiedź, która pomaga utrwalić wiedzę i przygotować się do egzaminu. Łącznie: 3704.
Strona 45 z 50.
Jaka jest różnica między polem zwykłym a polem statycznym w klasie?
Pole zwykłe należy do konkretnego obiektu, więc każdy obiekt ma własną kopię wartości. Pole statyczne należy do klasy i jest wspólne dla wszystkich obiektów tej klasy.
Czy do użycia elementu statycznego trzeba utworzyć obiekt klasy?
Nie zawsze. Element statyczny można zwykle wywołać przez nazwę klasy, np. `NazwaKlasy.metodaStatyczna()` lub `NazwaKlasy.poleStatyczne`.
Do czego można wykorzystać statyczne pole w klasie?
Można go użyć np. do przechowywania licznika obiektów, stałej konfiguracyjnej albo wspólnej wartości obowiązującej dla całej klasy.
Czy zmiana pola statycznego przez jeden obiekt wpływa na inne obiekty?
Tak. Ponieważ pole statyczne jest wspólne, zmiana jego wartości jest widoczna dla wszystkich instancji tej samej klasy.
Czym różni się metoda statyczna od metody obiektowej?
Metoda statyczna należy do klasy i może być wywołana bez tworzenia obiektu. Metoda obiektowa działa na konkretnej instancji i ma dostęp do jej pól.
Czy element statyczny ma związek z modyfikatorami dostępu, takimi jak public lub private?
`static` określa przynależność elementu do klasy, a nie poziom dostępu. Dostęp kontrolują modyfikatory takie jak `public`, `private` lub `protected`.
Czym jest klasa w programowaniu obiektowym?
Klasa to wzorzec opisujący obiekty. Określa, jakie dane obiekt przechowuje oraz jakie operacje można na nim wykonać.
Do czego służy słowo kluczowe class w C++?
Słowo kluczowe `class` rozpoczyna definicję klasy. Po nim podaje się nazwę klasy oraz jej ciało ujęte w nawiasy klamrowe.
Czy destruktor musi być jawnie zapisany w każdej klasie C++?
Nie. Jeśli destruktor nie zostanie zdefiniowany przez programistę, kompilator może utworzyć destruktor domyślny.
Kiedy warto samodzielnie zdefiniować destruktor w C++?
Destruktor warto zdefiniować, gdy obiekt zarządza zasobami, np. pamięcią dynamiczną, plikami lub uchwytami systemowymi. Pozwala wtedy poprawnie zwolnić zasoby.
Czym różni się konstruktor od destruktora?
Konstruktor jest wywoływany podczas tworzenia obiektu, a destruktor podczas jego niszczenia. Konstruktor inicjalizuje obiekt, a destruktor zwykle sprząta zasoby.
Czym są atrybuty klasy?
Atrybuty klasy to pola przechowujące dane obiektu. Przykładem może być `wiek`, `imie` albo `saldo`.
Czym są funkcje członkowskie klasy?
Funkcje członkowskie, czyli metody, to funkcje zdefiniowane w klasie. Operują zwykle na danych obiektu.
Dlaczego po definicji klasy w C++ trzeba postawić średnik?
Definicja klasy w C++ jest deklaracją typu, dlatego musi kończyć się średnikiem. Brak średnika po `}` spowoduje błąd kompilacji.
Czym różni się klasa statyczna od zwykłej klasy?
Zwykła klasa może mieć obiekty tworzone przez `new`, a klasa statyczna nie. Klasa statyczna zawiera tylko elementy statyczne dostępne przez nazwę klasy.
Dlaczego klasa statyczna nie może zawierać metod instancyjnych?
Metody instancyjne wymagają konkretnego obiektu, na którym są wywoływane. Klasy statycznej nie można instancjonować, więc nie miałoby to sensu.
Jak odwołać się do metody znajdującej się w klasie statycznej?
Do metody statycznej odwołujemy się przez nazwę klasy, np. `Matematyka.Kwadrat(5)`, bez tworzenia obiektu.
Czy klasę statyczną można dziedziczyć?
Nie. W C# klasa statyczna nie może być klasą bazową ani potomną, ponieważ nie działa jak zwykły typ obiektowy przeznaczony do dziedziczenia.
Do czego najczęściej wykorzystuje się klasy statyczne?
Najczęściej do metod pomocniczych, stałych, funkcji matematycznych, konwersji danych lub narzędzi niewymagających przechowywania stanu obiektu.
Czym jest element statyczny klasy?
Element statyczny należy do klasy jako całości, a nie do pojedynczego obiektu. Jest wspólny dla wszystkich miejsc programu korzystających z tej klasy.
Jaki jest cel konstruktora kopiującego?
Konstruktor kopiujący tworzy nowy obiekt na podstawie już istniejącego obiektu tej samej klasy. Służy do inicjalizacji kopii obiektu.
Jak wygląda typowa deklaracja konstruktora kopiującego w C++?
Typowa deklaracja ma postać: `NazwaKlasy(const NazwaKlasy& innyObiekt);`. Parametr przekazywany jest najczęściej przez stałą referencję.
Dlaczego parametr konstruktora kopiującego przekazuje się przez referencję?
Przekazanie przez wartość wymagałoby utworzenia kopii argumentu, co ponownie wywołałoby konstruktor kopiujący. Mogłoby to prowadzić do nieskończonego wywoływania konstruktora.
Kiedy konstruktor kopiujący jest wywoływany automatycznie?
Jest wywoływany m.in. podczas inicjalizacji obiektu innym obiektem tej samej klasy, przekazywania obiektu przez wartość do funkcji lub zwracania obiektu przez wartość.
Czym różni się konstruktor kopiujący od operatora przypisania?
Konstruktor kopiujący tworzy nowy obiekt jako kopię istniejącego. Operator przypisania działa na obiekcie, który już istnieje, i przypisuje mu wartości z innego obiektu.
Co to jest płytka kopia obiektu?
Płytka kopia kopiuje wartości pól bez tworzenia niezależnych kopii zasobów dynamicznych. Może to być problematyczne, gdy obiekt przechowuje wskaźniki do pamięci.
Co to jest głęboka kopia obiektu?
Głęboka kopia tworzy niezależne kopie zasobów, np. dynamicznie zaalokowanej pamięci. Dzięki temu dwa obiekty nie współdzielą tego samego zasobu.
Czy kompilator może sam wygenerować konstruktor kopiujący?
Tak, jeśli programista go nie zdefiniuje, kompilator może utworzyć domyślny konstruktor kopiujący. Taka kopia zwykle kopiuje pola obiektu jeden do jednego.
Czym jest klasa bazowa w hierarchii dziedziczenia?
Klasa bazowa to klasa nadrzędna, z której inne klasy mogą dziedziczyć pola i metody. Zawiera zwykle cechy wspólne dla kilku klas pochodnych.
Czym jest klasa pochodna?
Klasa pochodna to klasa, która dziedziczy po innej klasie. Może korzystać z odziedziczonych elementów oraz dodawać własne pola i metody.
Jaką relację opisuje dziedziczenie w programowaniu obiektowym?
Dziedziczenie opisuje relację typu „jest rodzajem”. Na przykład `Samochod` jest rodzajem `Pojazdu`.
Jakie elementy klasy mogą być dziedziczone?
Najczęściej dziedziczone są pola i metody klasy bazowej. Zakres dostępu do nich zależy od modyfikatorów dostępu, np. public, protected lub private.
Po co tworzy się hierarchię dziedziczenia?
Hierarchia dziedziczenia pomaga uporządkować kod i ograniczyć jego powtarzanie. Ułatwia też rozbudowę programu i stosowanie polimorfizmu.
Czy klasa pochodna może zmienić działanie metody odziedziczonej z klasy bazowej?
Tak, w wielu językach programowania klasa pochodna może przesłonić metodę klasy bazowej. Dzięki temu zachowuje wspólny interfejs, ale realizuje własne działanie.
Czym różni się hierarchia dziedziczenia od zwykłego zbioru klas?
W hierarchii dziedziczenia klasy są ze sobą powiązane relacją nadrzędna-podrzędna. Zwykły zbiór klas nie musi mieć żadnych relacji dziedziczenia.
Czym jest klasa nadrzędna w dziedziczeniu?
Klasa nadrzędna to klasa, z której dziedziczą inne klasy. Zawiera wspólne pola i metody dla klas pochodnych.
Dlaczego pola wspólne umieszcza się w klasie nadrzędnej?
Pozwala to uniknąć powielania kodu w wielu klasach pochodnych. Ułatwia też późniejsze zmiany i utrzymanie programu.
Czy pole charakterystyczne tylko dla jednej klasy pochodnej powinno być w klasie nadrzędnej?
Nie. Takie pole powinno znajdować się tylko w tej klasie pochodnej, której rzeczywiście dotyczy.
Jaka jest różnica między klasą nadrzędną a klasą pochodną?
Klasa nadrzędna definiuje cechy ogólne, a klasa pochodna dziedziczy je i może dodawać własne, bardziej szczegółowe pola oraz metody.
Czy pola w klasie nadrzędnej muszą być prywatne?
Nie. O umieszczeniu pola w klasie nadrzędnej decyduje to, czy jest wspólne dla klas pochodnych, a nie sam modyfikator dostępu.
Czy elementy statyczne decydują o tym, co powinno znaleźć się w klasie nadrzędnej?
Nie. Element statyczny należy do klasy, a nie do konkretnego obiektu. W pytaniu o dziedziczenie najważniejsze jest to, czy pole jest wspólne dla klas pochodnych.
Jak rozpoznać, które pola przenieść do klasy nadrzędnej?
Należy sprawdzić, czy dane pole występuje logicznie w każdej klasie pochodnej. Jeśli tak, jest dobrym kandydatem do klasy nadrzędnej.
Czym różni się klasa bazowa od klasy pochodnej?
Klasa bazowa jest klasą, z której dziedziczą inne klasy. Klasa pochodna przejmuje jej atrybuty i metody oraz może dodawać własne elementy.
Co oznacza dziedziczenie w programowaniu obiektowym?
Dziedziczenie pozwala tworzyć nowe klasy na podstawie już istniejących. Dzięki temu można ponownie wykorzystać kod i rozszerzać funkcjonalność programu.
Czy klasa pochodna może mieć własne metody?
Tak. Klasa pochodna może korzystać z metod odziedziczonych, ale może też definiować nowe metody specyficzne dla siebie.
Czy klasa pochodna zawsze ma dostęp do wszystkich elementów klasy bazowej?
Nie zawsze. Dostęp zależy od modyfikatorów dostępu, takich jak `public`, `protected` i `private`.
Na czym polega nadpisywanie metod w klasie pochodnej?
Nadpisywanie polega na zdefiniowaniu w klasie pochodnej własnej wersji metody odziedziczonej z klasy bazowej. Pozwala to zmienić zachowanie metody dla konkretnej klasy.
Dlaczego dziedziczenie zmniejsza powtarzanie kodu?
Wspólne pola i metody można umieścić w klasie bazowej. Klasy pochodne korzystają z nich bez konieczności ponownego przepisywania tego samego kodu.
Czym jest metoda wirtualna w programowaniu obiektowym?
Metoda wirtualna to metoda zdefiniowana w klasie bazowej, którą można przesłonić w klasie pochodnej. Dzięki temu wywołanie metody może zależeć od rzeczywistego typu obiektu.
Na czym polega przesłanianie metody?
Przesłanianie polega na zdefiniowaniu w klasie dziedziczącej metody o tej samej nazwie i zgodnej sygnaturze jak w klasie bazowej. Nowa wersja metody zastępuje zachowanie odziedziczone.
Jaki związek mają metody wirtualne z dziedziczeniem?
Metody wirtualne mają sens głównie w hierarchii dziedziczenia. Klasa bazowa udostępnia metodę, a klasy pochodne mogą dostarczyć własną implementację.
Czym różni się przesłanianie metody od przeciążania metody?
Przesłanianie dotyczy metody odziedziczonej i zmiany jej działania w klasie pochodnej. Przeciążanie oznacza utworzenie kilku metod o tej samej nazwie, ale różnych parametrach.
Po co stosuje się metody wirtualne?
Stosuje się je, aby uzyskać polimorfizm, czyli możliwość wywoływania różnych wersji tej samej metody zależnie od typu obiektu. Ułatwia to tworzenie elastycznego i rozszerzalnego kodu.
Czy metoda statyczna jest typowym przykładem metody wirtualnej?
Nie. Metody wirtualne są związane z obiektami i dziedziczeniem, natomiast metody statyczne należą do klasy, a nie do konkretnego obiektu.
Czym różni się metoda wirtualna od metody abstrakcyjnej?
Metoda wirtualna może mieć implementację w klasie bazowej i może zostać przesłonięta. Metoda abstrakcyjna zwykle nie ma implementacji i musi zostać zaimplementowana w klasie pochodnej.
Jakim słowem kluczowym definiuje się klasę w C++?
Klasę w C++ definiuje się słowem kluczowym `class`, np. `class Osoba { };`.
Czym jest klasa nadrzędna w programowaniu obiektowym?
Klasa nadrzędna, inaczej bazowa, to klasa, z której dziedziczy inna klasa. Udostępnia ona swoje pola i metody klasie pochodnej zgodnie z zasadami dostępu.
Jak wygląda składnia dziedziczenia w C++?
Dziedziczenie zapisuje się np. `class Pracownik : public Osoba { };`, gdzie `Pracownik` jest klasą pochodną, a `Osoba` klasą nadrzędną.
Jaką rolę pełni słowo `public` przy dziedziczeniu w C++?
`public` nie definiuje klasy, tylko określa sposób dziedziczenia lub poziom dostępu do składników klasy. W zapisie `class B : public A` oznacza dziedziczenie publiczne.
Do czego służy słowo kluczowe `virtual` w C++?
`virtual` służy m.in. do definiowania metod wirtualnych, które mogą być nadpisywane w klasach pochodnych i wywoływane polimorficznie.
Czy `base` jest słowem kluczowym w C++?
Nie, `base` nie jest słowem kluczowym języka C++. Może być użyte jako zwykła nazwa identyfikatora, np. nazwa zmiennej lub klasy.
Jaka jest różnica między klasą nadrzędną a klasą pochodną?
Klasa nadrzędna jest klasą bazową, z której dziedziczy inna klasa. Klasa pochodna rozszerza lub modyfikuje funkcjonalność klasy nadrzędnej.
Na czym polega przesłanianie metody w programowaniu obiektowym?
Polega na zdefiniowaniu w klasie pochodnej metody o tej samej nazwie jak w klasie bazowej, ale z własną implementacją. Pozwala to zmienić odziedziczone zachowanie.
Jaki związek ma przesłanianie metody z dziedziczeniem?
Przesłanianie wymaga relacji dziedziczenia, ponieważ klasa pochodna modyfikuje zachowanie metody odziedziczonej z klasy bazowej.
Czym różni się przesłanianie metody od przeciążania metody?
Przesłanianie dotyczy klasy bazowej i pochodnej oraz zmiany implementacji metody. Przeciążanie oznacza kilka metod o tej samej nazwie, ale z różnymi parametrami, najczęściej w tej samej klasie.
Dlaczego przesłanianie metod jest ważne dla polimorfizmu?
Dzięki przesłanianiu ten sam kod może wywołać metodę o tej samej nazwie, ale wykonanie zależy od rzeczywistego typu obiektu. To jedna z podstaw działania polimorfizmu.
Co oznacza adnotacja @Override w Javie?
Adnotacja @Override informuje, że metoda ma przesłaniać metodę z klasy bazowej lub interfejsu. Kompilator sprawdzi wtedy, czy przesłanianie jest poprawne.
Czy metoda prywatna może być typowo przesłonięta w klasie pochodnej?
Nie w klasycznym sensie, ponieważ metoda prywatna nie jest dostępna dla klasy pochodnej. Można utworzyć metodę o tej samej nazwie, ale nie jest to właściwe przesłanianie odziedziczonej metody.
Jak rozpoznać przesłanianie metody w kodzie?
Należy sprawdzić, czy klasa pochodna definiuje metodę o tej samej nazwie i zgodnej sygnaturze jak metoda w klasie bazowej, ale z innym ciałem metody.