Konstruktory

Konstruktor to specjalna funkcja (metoda klasy), wywoływana, gdy tworzona jest instancjainstancja klasyinstancja danej klasy. Wewnątrz konstruktora zdefiniowane są instrukcje, które mają zostać wykonane przy utworzeniu obiektu klasy.

W każdym języku programowania (o ile dany język wspiera programowanie obiektowe) konstruktory deklarowane są na różne sposoby. Najczęściej jednak konstruktor przyjmuje nazwę klasy, w której się znajduje.

Konstruktor zwykły

Przeanalizujmy przykład konstruktora zwykłego.

Linia 1. klasa Uczen. Linia 2. imie dwukropek tekst. Linia 3. nazwisko dwukropek tekst. Linia 4. wiek dwukropek liczba całkowita. Linia 6. funkcja Uczen otwórz nawias okrągły imieUcznia przecinek nazwiskoUcznia przecinek wiekUcznia zamknij nawias okrągły. Linia 7. imie ← imieUcznia. Linia 8. nazwisko ← nazwiskoUcznia. Linia 9. wiek ← wiekUcznia.

Zdefiniowana w 6. linii funkcja o nazwie Uczen() to analizowany przez nas konstruktor. Oznacza to, że funkcja ta zostanie wywołana podczas tworzenia obiektu klasy Uczen. Należy wtedy podać trzy parametryparametrparametry, które nadadzą wartości atrybutom klasy Uczen: imie, nazwisko, wiek.

W obrębie danej klasy może być zdefiniowanych wiele konstruktorów. Jeżeli chcemy stworzyć więcej niż jeden konstruktor, to każdy z nich musi różnić się typem, liczbą lub kolejnością parametrów.

W zależności od języka programowania wyróżnia się specjalne typy konstruktorów. Omówimy tutaj niektóre z nich.

Konstruktor domyślny

To rodzaj konstruktora, który nie ma zdefiniowanych parametrów (bądź mają one ustawione wartości domyślne). Podczas tworzenia obiektu klasy za pomocą konstruktora domyślnego, nie są podawane żadne argumentyargumentargumenty. W przypadku gdy dla danej klasy nie zdefiniowano żadnego konstruktora, zostanie on wygenerowany automatycznie, zgodnie ze specyfikacją danego języka programowania.

Oto przykłady tego rodzaju konstruktora:

Linia 1. klasa Uczen. Linia 2. imie dwukropek tekst. Linia 3. nazwisko dwukropek tekst. Linia 4. wiek dwukropek liczba całkowita. Linia 6. funkcja Uczen otwórz nawias okrągły zamknij nawias okrągły. Linia 7. imie ← cudzysłów Imię cudzysłów. Linia 8. nazwisko ← cudzysłów Nazwisko cudzysłów. Linia 9. wiek ← 22. Linia 11. funkcja Uczen otwórz nawias okrągły imieUcznia ← cudzysłów Imię cudzysłów przecinek nazwiskoUcznia ← cudzysłów Nazwisko cudzysłów przecinek wiekUcznia ← 22 zamknij nawias okrągły. Linia 12. imie ← imieUcznia. Linia 13. nazwisko ← nazwiskoUcznia. Linia 14. wiek ← wiekUcznia.

Drugi z konstruktorów przedstawionych w pseudokodzie pełni funkcję zarówno konstruktora domyślnego, jak i zwykłego.

Konstruktor kopiujący

Taki konstruktor przyjmuje tylko jeden argument - referencjęreferencjareferencję do obiektu tej samej klasy. Następnie ma on za zadanie skopiowanie wartości pól z obiektu podanego przez referencję do nowo tworzonej instancji klasy.

Linia 1. klasa Uczen. Linia 2. imie dwukropek tekst. Linia 3. nazwisko dwukropek tekst. Linia 4. wiek dwukropek liczba całkowita. Linia 6. funkcja Uczen otwórz nawias okrągły uczen zamknij nawias okrągły. Linia 7. imie ← uczen kropka imie. Linia 8. nazwisko ← uczen kropka nazwisko. Linia 9. wiek ← uczen kropka wiek.

Przedstawiony przykład pokazuje praktyczne wykorzystanie konstruktora kopiującego. Utworzono obiekt klasy Uczen oraz – poprzez konstruktor zwykły – zostały podane wartości parametrów: "Jan", "Kowalski", 12. Następnie utworzono drugi obiekt (również klasy Uczenuczen2) za pomocą konstruktora kopiującego.

W obiekcie uczen2 wartości pól imie, nazwisko, wiek będą takie same, jak w obiekcie uczen, czyli odpowiednio: "Jan", "Kowalski", 12.

Linia 1. klasa Uczen. Linia 2. imie dwukropek tekst. Linia 3. nazwisko dwukropek tekst. Linia 4. wiek dwukropek liczba całkowita. Linia 6. funkcja Uczen otwórz nawias okrągły imieUcznia przecinek nazwiskoUcznia przecinek wiekUcznia zamknij nawias okrągły. Linia 7. imie ← imieUcznia. Linia 8. nazwisko ← nazwiskoUcznia. Linia 9. wiek ← wiekUcznia. Linia 11. funkcja Uczen otwórz nawias okrągły uczen zamknij nawias okrągły. Linia 12. imie ← uczen kropka imie. Linia 13. nazwisko ← uczen kropka nazwisko. Linia 14. wiek ← uczen kropka wiek. Linia 16. Uczen uczen ← nowy Uczen otwórz nawias okrągły cudzysłów Jan cudzysłów przecinek cudzysłów Kowalski cudzysłów przecinek 12 zamknij nawias okrągły. Linia 17. Uczen uczen2 ← nowy Uczen otwórz nawias okrągły uczen zamknij nawias okrągły.

Konstruktor teleskopowy

Szczególnym rodzajem konstruktora jest konstruktor teleskopowy. Zakłada on w rzeczywistości utworzenie kilku konstruktorów. Spójrzmy na przykład:

Linia 1. klasa Osoba. Linia 2. imie dwukropek tekst. Linia 3. drugieImie dwukropek tekst. Linia 4. nazwisko dwukropek tekst. Linia 5. nazwiskoRodowe dwukropek tekst. Linia 6. wiek dwukropek liczba całkowita. Linia 8. funkcja Osoba otwórz nawias okrągły imieOsoby przecinek drugieImieOsoby przecinek nazwiskoOsoby przecinek nazwiskoRodoweOsoby przecinek wiekOsoby zamknij nawias okrągły. Linia 9. imie ← imieOsoby. Linia 10. drugieImie ← drugieImieOsoby. Linia 11. nazwisko ← nazwiskoOsoby. Linia 12. nazwiskoRodowe ← nazwiskoRodoweOsoby. Linia 13. wiek ← wiekOsoby.

Przedstawiony konstruktor klasy Osoba umożliwia utworzenie i nadanie wartości atrybutom obiektu tej klasy. Gdybyśmy skorzystali z tego konstruktora, musielibyśmy podać wszystkie wartości atrybutów. Co jednak w przypadku, gdy dana osoba nie będzie miała drugiego imienia?

Konstruktor teleskopowy okazuje się bardzo przydatny, gdy w obrębie klasy są zdefiniowane atrybuty opcjonalne, takie jak np. drugie imię.

Zobaczmy, jak wygląda jego budowa:

Linia 1. klasa Osoba. Linia 2. imie dwukropek tekst. Linia 3. drugieImie dwukropek tekst. Linia 4. nazwisko dwukropek tekst. Linia 5. nazwiskoRodowe dwukropek tekst. Linia 6. wiek dwukropek liczba całkowita. Linia 8. funkcja Osoba otwórz nawias okrągły imieOsoby przecinek nazwiskoOsoby przecinek nazwiskoRodoweOsoby przecinek wiekOsoby zamknij nawias okrągły. Linia 9. imie ← imieOsoby. Linia 10. nazwisko ← nazwiskoOsoby. Linia 11. nazwiskoRodowe ← nazwiskoRodoweOsoby. Linia 12. wiek ← wiekOsoby. Linia 15. funkcja Osoba otwórz nawias okrągły imieOsoby przecinek drugieImieOsoby przecinek nazwiskoOsoby przecinek nazwiskoRodoweOsoby przecinek wiekOsoby zamknij nawias okrągły. Linia 16. Osoba otwórz nawias okrągły imieOsoby przecinek nazwiskoOsoby przecinek nazwiskoRodoweOsoby przecinek wiekOsoby zamknij nawias okrągły. Linia 17. drugieImie ← drugieImieOsoby.

W tym przykładzie pierwszy konstruktor nadaje wartości atrybutom, które nie są opcjonalne – zakładamy, że każda osoba musi mieć imię, nazwisko, nazwisko rodowe i wiek. Drugi konstruktor zawiera w sobie wywołanie pierwszego konstruktora (dla atrybutów imie, nazwisko, nazwiskoRodowe oraz wiek), a także oprócz tego nadaje wartość drugiego imienia.

Destruktory

Destruktor, jak sugeruje nazwa, jest przeciwieństwem konstruktora. Zostaje on najczęściej wywołany automatycznie, tuż przed usunięciem danego obiektu klasy. Ma na celu przygotowanie do fizycznego zwolnienia zajmowanej przez obiekt pamięci. W destruktorze można zawrzeć m.in. instrukcję zamknięcia połączenia z plikiem lub wyrejestrowanie się z innych obiektów. Destruktor nie przyjmuje żadnych argumentów.

Co istotne – podczas gdy klasa może posiadać wiele konstruktorów, destruktor może być tylko jeden.

Słownik

instancja klasy
instancja klasy

niezależny obiekt danej klasy, zajmujący określone miejsce w pamięci

argument
argument

konkretna wartość lub zmienna przekazywana do funkcji lub metody przy jej wywołaniu

parametr
parametr

definicja zmiennej zawarta w deklaracji metody lub funkcji; deklarujemy ją w nawiasach, np. funkcja(liczba parametr1, tekst parametr2)

referencja
referencja

zmienna zawierająca informacje o położeniu w pamięci innej zmiennej lub obiektu