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 44 z 50.

Do czego służy funkcja zaprzyjaźniona w C++?

Służy do nadania wybranej funkcji dostępu do prywatnych i chronionych składników klasy. Deklaruje się ją za pomocą słowa kluczowego `friend`.

Czy funkcja zaprzyjaźniona jest metodą klasy?

Najczęściej nie jest metodą tej klasy, mimo że jej deklaracja znajduje się wewnątrz klasy. Nie ma więc wskaźnika `this`.

Jakiego słowa kluczowego używa się do deklarowania funkcji zaprzyjaźnionej?

Używa się słowa kluczowego `friend`. Deklarację umieszcza się wewnątrz definicji klasy.

Jak funkcja zaprzyjaźniona wpływa na hermetyzację?

Osłabia hermetyzację, ponieważ pozwala funkcji zewnętrznej na dostęp do prywatnych danych klasy. Dlatego należy stosować ją tylko wtedy, gdy jest to uzasadnione.

Czym różni się funkcja zaprzyjaźniona od konstruktora?

Konstruktor uruchamia się automatycznie podczas tworzenia obiektu. Funkcja zaprzyjaźniona działa tylko po zwykłym, jawnym wywołaniu.

Czy funkcja zaprzyjaźniona może modyfikować prywatne pola obiektu?

Tak, jeśli otrzyma obiekt w sposób pozwalający na modyfikację, na przykład przez referencję. Sam status `friend` daje jej dostęp do pól prywatnych.

Czy zaprzyjaźnienie jest dziedziczone w C++?

Nie. Jeśli funkcja jest zaprzyjaźniona z jedną klasą, nie oznacza to automatycznie zaprzyjaźnienia z jej klasami pochodnymi.

Do czego służy konstruktor w programowaniu obiektowym?

Konstruktor służy do inicjalizacji nowo tworzonego obiektu. Najczęściej nadaje wartości początkowe polom klasy i przygotowuje obiekt do użycia.

Kiedy wywoływany jest konstruktor?

Konstruktor jest wywoływany automatycznie podczas tworzenia instancji klasy, czyli obiektu. Programista zwykle nie wywołuje go jak zwykłej metody.

Czym różni się konstruktor od zwykłej metody?

Konstruktor uruchamia się przy tworzeniu obiektu i inicjalizuje jego stan. Zwykła metoda wykonuje określone działanie na już istniejącym obiekcie.

Czy metoda statyczna inicjalizuje pola konkretnego obiektu?

Metoda statyczna należy do klasy, a nie do konkretnej instancji obiektu. Może operować głównie na składowych statycznych, więc nie jest podstawowym mechanizmem inicjalizacji pól obiektu.

Czym są pola klasy?

Pola klasy, nazywane też atrybutami, przechowują dane opisujące stan obiektu. Przykładowo klasa `Samochod` może mieć pola `marka`, `kolor` i `predkosc`.

Co oznacza utworzenie instancji obiektu?

Utworzenie instancji oznacza stworzenie konkretnego obiektu na podstawie definicji klasy. Klasa jest wzorcem, a obiekt jest jego konkretnym egzemplarzem.

Dlaczego instrukcja warunkowa nie jest odpowiedzią na to pytanie?

Instrukcja warunkowa służy do wyboru ścieżki wykonania programu, np. `if`. Nie jest specjalnym komponentem klasy odpowiedzialnym za tworzenie i inicjalizację obiektu.

Do czego służy konstruktor w klasie?

Konstruktor służy do inicjalizacji nowo tworzonego obiektu. Najczęściej ustawia wartości początkowe pól obiektu.

Czym konstruktor różni się od zwykłej metody?

Konstruktor jest wywoływany automatycznie podczas tworzenia obiektu i nie ma typu zwracanego. Zwykła metoda jest wywoływana jawnie i może zwracać wartość.

Czy konstruktor może zwracać wartość?

Nie. Konstruktor nie deklaruje typu zwracanego, nawet typu void.

Kiedy wywoływany jest konstruktor?

Konstruktor jest wywoływany w momencie tworzenia obiektu klasy, np. przy użyciu operatora new albo deklaracji obiektu, zależnie od języka.

Czy zwykła metoda musi mieć taką samą nazwę jak klasa?

Nie. Zwykła metoda może mieć dowolną poprawną nazwę, zgodną z zasadami nazewnictwa danego języka.

Czy w jednej klasie może istnieć kilka konstruktorów?

Tak, w wielu językach można przeciążać konstruktory, czyli tworzyć kilka konstruktorów z różnymi listami parametrów.

Jaka jest rola konstruktora domyślnego?

Konstruktor domyślny pozwala utworzyć obiekt bez przekazywania argumentów. Może być zdefiniowany przez programistę albo wygenerowany automatycznie przez kompilator.

Czym jest modyfikator dostępu w programowaniu obiektowym?

Modyfikator dostępu określa, skąd można korzystać z klasy, pola, metody lub innego elementu programu. Przykładami są `public`, `private` i `protected`.

Dlaczego `public` oznacza dostęp z każdego miejsca w kodzie?

`public` nie ogranicza dostępu do elementu klasy. Oznacza to, że można odwołać się do niego zarówno wewnątrz klasy, jak i poza nią.

Jaka jest różnica między `public` a `private`?

`public` pozwala na dostęp z dowolnego miejsca w kodzie, natomiast `private` ogranicza dostęp tylko do wnętrza tej samej klasy.

Jaka jest różnica między `public` a `protected`?

`public` daje dostęp wszystkim częściom programu. `protected` pozwala na dostęp tylko wewnątrz danej klasy oraz w klasach pochodnych.

Dlaczego `static` nie jest poprawną odpowiedzią w tym pytaniu?

`static` nie określa poziomu dostępu do elementu. Oznacza, że element należy do klasy, a nie do konkretnej instancji obiektu.

Czy stosowanie `public` dla wszystkich pól klasy jest dobrą praktyką?

Zwykle nie. W programowaniu obiektowym często ukrywa się pola jako `private`, a dostęp do nich kontroluje przez publiczne metody lub właściwości.

Czym jest klasa dziedzicząca?

Klasa dziedzicząca, nazywana też klasą pochodną, przejmuje pola i metody klasy bazowej. Dzięki temu może korzystać z już istniejącego kodu bez jego ponownego definiowania.

Jaka jest różnica między klasą bazową a klasą pochodną?

Klasa bazowa udostępnia swoje elementy do dziedziczenia. Klasa pochodna dziedziczy po klasie bazowej i może rozszerzać lub modyfikować jej działanie.

Czy klasa dziedzicząca musi ponownie definiować odziedziczone metody?

Nie. Może korzystać z odziedziczonych metod bez ich ponownej definicji. Może je jednak przesłonić lub nadpisać, jeśli język i projekt klasy na to pozwalają.

Czy klasa pochodna ma dostęp do prywatnych pól klasy bazowej?

Zwykle nie ma bezpośredniego dostępu do pól prywatnych klasy bazowej. Może korzystać z nich pośrednio przez publiczne lub chronione metody klasy bazowej.

Jaką rolę pełni modyfikator protected w dziedziczeniu?

Element oznaczony jako protected jest dostępny w klasie bazowej oraz w klasach pochodnych. Nie jest natomiast publicznie dostępny z zewnątrz obiektu.

Czy klasa dziedzicząca może mieć własne konstruktory i destruktory?

Tak. Klasa pochodna może definiować własne konstruktory i destruktory. Stwierdzenie, że klasa dziedzicząca nie może ich posiadać, jest błędne.

Na czym polega ponowne użycie kodu dzięki dziedziczeniu?

Dziedziczenie pozwala wykorzystać istniejące pola i metody klasy bazowej w klasie pochodnej. Zmniejsza to powielanie kodu i ułatwia rozwijanie programu.

Czy dziedziczenie oznacza współdzielenie pól z klasami zaprzyjaźnionymi?

Nie. Dziedziczenie polega na relacji klasa bazowa–klasa pochodna. Klasy lub funkcje zaprzyjaźnione to osobny mechanizm, znany m.in. z C++.

Czym różni się pole statyczne od zwykłego pola obiektu?

Pole statyczne istnieje raz dla całej klasy i jest wspólne dla wszystkich obiektów. Zwykłe pole istnieje osobno w każdej instancji klasy.

Do czego najczęściej wykorzystuje się pola statyczne?

Najczęściej służą do przechowywania danych wspólnych, np. liczby utworzonych obiektów, globalnej konfiguracji klasy albo wspólnych stałych.

Czy składnik statyczny wymaga utworzenia obiektu klasy?

Nie. Do składnika statycznego można odwołać się przez nazwę klasy, np. `NazwaKlasy::pole` lub `NazwaKlasy::metoda()`.

Dlaczego metoda statyczna nie może korzystać bezpośrednio z pól konkretnego obiektu?

Metoda statyczna nie jest wywoływana na konkretnym obiekcie, więc nie posiada wskaźnika `this`. Może bezpośrednio korzystać tylko z innych składników statycznych klasy.

Czy składnik statyczny tworzy prywatną kopię danych dla każdej instancji?

Nie. Prywatne kopie danych dla każdej instancji tworzą zwykłe pola obiektu, a nie pola statyczne.

Jaki jest związek między składnikiem statycznym a destruktorem?

Składnik statyczny nie służy do wywoływania destruktora. Destruktor jest specjalną metodą uruchamianą przy niszczeniu obiektu.

Czym różni się pole statyczne od pola instancyjnego?

Pole statyczne należy do klasy i istnieje niezależnie od obiektów. Pole instancyjne należy do konkretnego obiektu i jest tworzone razem z nim.

Dlaczego pole static można zainicjalizować przed stworzeniem obiektu?

Ponieważ pole statyczne jest powiązane z klasą, a nie z instancją klasy. Jego wartość może istnieć już w momencie załadowania klasy.

Czy modyfikator public oznacza to samo co static?

Nie. `public` określa dostępność pola z zewnątrz klasy, a `static` określa, że pole należy do klasy, a nie do obiektu.

Do czego najczęściej używa się pól statycznych?

Pola statyczne stosuje się np. do przechowywania liczników, konfiguracji, stałych lub danych wspólnych dla wszystkich obiektów danej klasy.

Jak odwołać się do pola statycznego?

Najczęściej przez nazwę klasy, np. `NazwaKlasy.nazwaPola`. Nie trzeba tworzyć obiektu za pomocą `new`.

Czy private static field może istnieć przed utworzeniem obiektu?

Tak. `private` ogranicza dostęp do pola, ale nie zmienia faktu, że pole oznaczone jako `static` należy do klasy i może istnieć bez obiektu.

Czym jest funkcja zaprzyjaźniona w C++?

Funkcja zaprzyjaźniona to funkcja zadeklarowana w klasie za pomocą słowa kluczowego `friend`. Nie jest metodą tej klasy, ale może uzyskiwać dostęp do jej pól i metod prywatnych oraz chronionych.

Po co stosuje się funkcje zaprzyjaźnione?

Stosuje się je wtedy, gdy funkcja zewnętrzna musi operować bezpośrednio na prywatnych danych klasy. Typowym przykładem jest przeciążanie operatorów, np. operatora wypisywania `<<`.

Czy funkcja zaprzyjaźniona jest metodą klasy?

Nie. Funkcja zaprzyjaźniona nie należy do klasy, mimo że ma dostęp do jej prywatnych składników. Wywołuje się ją jak zwykłą funkcję, a nie przez obiekt jako metodę.

Jak funkcja zaprzyjaźniona wpływa na hermetyzację?

Funkcja zaprzyjaźniona częściowo osłabia hermetyzację, ponieważ umożliwia dostęp do prywatnych danych spoza klasy. Dlatego należy używać jej tylko wtedy, gdy jest to uzasadnione.

Jak zadeklarować funkcję zaprzyjaźnioną w klasie C++?

Wewnątrz definicji klasy należy poprzedzić deklarację funkcji słowem kluczowym `friend`, np. `friend void pokaz(Dane d);`. Sama definicja funkcji może znajdować się poza klasą.

Czy funkcja zaprzyjaźniona może modyfikować prywatne pola obiektu?

Tak, jeśli otrzyma dostęp do obiektu, może odczytywać i modyfikować jego prywatne pola, o ile nie ogranicza tego np. przekazanie obiektu jako `const`.

Czym jest funkcja zaprzyjaźniona w C++?

Funkcja zaprzyjaźniona to funkcja zadeklarowana w klasie słowem kluczowym `friend`. Nie jest metodą klasy, ale może mieć dostęp do jej pól i metod prywatnych oraz chronionych.

Czy funkcja zaprzyjaźniona należy do klasy?

Nie. Funkcja zaprzyjaźniona jest definiowana poza klasą i nie jest jej metodą, mimo że może korzystać z prywatnych i chronionych elementów klasy.

Jak oznacza się funkcję zaprzyjaźnioną w deklaracji klasy?

Wewnątrz klasy umieszcza się jej deklarację poprzedzoną słowem kluczowym `friend`, np. `friend void pokaz(Dane d);`.

Jaka jest różnica między metodą klasy a funkcją zaprzyjaźnioną?

Metoda jest składnikiem klasy i zwykle wywołuje się ją na obiekcie. Funkcja zaprzyjaźniona nie należy do klasy, ale dzięki deklaracji `friend` może uzyskać dostęp do jej niedostępnych z zewnątrz elementów.

Dlaczego funkcja zaprzyjaźniona może osłabiać hermetyzację?

Hermetyzacja polega na ukrywaniu szczegółów klasy przed kodem zewnętrznym. Funkcja zaprzyjaźniona jest wyjątkiem od tej zasady, ponieważ dostaje dostęp do elementów `private` i `protected`.

Czy konstruktor i destruktor są funkcjami zaprzyjaźnionymi?

Nie. Konstruktor i destruktor są specjalnymi metodami klasy: konstruktor tworzy i inicjalizuje obiekt, a destruktor wykonuje czynności przy jego niszczeniu.

Do czego praktycznie używa się funkcji zaprzyjaźnionych?

Często używa się ich do przeciążania operatorów lub tworzenia funkcji pomocniczych, które muszą mieć dostęp do wewnętrznych danych klasy, ale logicznie nie powinny być jej metodami.

Czym jest klasa zaprzyjaźniona?

To klasa, która dzięki deklaracji `friend class` ma dostęp do prywatnych i chronionych elementów innej klasy. Mechanizm ten występuje przede wszystkim w C++.

Która klasa decyduje o zaprzyjaźnieniu?

Decyduje klasa udostępniająca swoje prywatne lub chronione elementy. To ona umieszcza deklarację `friend class NazwaKlasy;` w swojej definicji.

Czy zaprzyjaźnienie klas jest obustronne?

Nie. Jeśli klasa A zaprzyjaźni klasę B, to B ma dostęp do A, ale A nie uzyskuje automatycznie dostępu do prywatnych elementów B.

Czy klasa zaprzyjaźniona łamie hermetyzację?

Nie musi jej całkowicie łamać, ale ją osłabia, ponieważ pozwala ominąć standardowe ograniczenia dostępu. Dlatego należy używać jej tylko wtedy, gdy jest to uzasadnione projektem.

Jaka jest różnica między klasą zaprzyjaźnioną a funkcją zaprzyjaźnioną?

Funkcja zaprzyjaźniona to pojedyncza funkcja z dostępem do prywatnych elementów klasy. Klasa zaprzyjaźniona oznacza, że wszystkie metody tej klasy mogą uzyskać taki dostęp.

Czy klasa zaprzyjaźniona musi dziedziczyć po klasie, do której ma dostęp?

Nie. Zaprzyjaźnienie nie jest dziedziczeniem. Klasa zaprzyjaźniona otrzymuje specjalne prawa dostępu bez relacji klasy bazowej i pochodnej.

Czy przyjaźń klas jest dziedziczona?

Nie. Jeśli klasa B jest zaprzyjaźniona z klasą A, to klasy pochodne B nie dostają automatycznie takich samych uprawnień.