do koszyka![]() |
do koszyka![]() |
do koszyka![]() |
do koszyka![]() |
do koszyka![]() |
do koszyka![]() |
do koszyka![]() |
do koszyka![]() |
do koszyka![]() |
![]() KURS JĘZYKA C++ PODSTAWY
00. Informacje ogólne - wstęp 01. Praca z konsolą - początki - cout 02. Zmienne (int, float, double) 03. Konsola cd. - cin 04. Zmienne tekstowe - (char, string) 05. Operatory 06. Instrukcje warunkowe (if - else, switch - case) 07. Pętle (for, while) 08. Instrukcje warunkowe cd. 09. Break, Continue 10. Funkcje 11. Zakresy ważności 12. Tablice zmiennych 13. Mała powtórka :))) 14. Struct - struktury 15. String, Vector - wstęp do STL 16. Wskaźniki, referencje 16a. Wskaźnik do typów prostych 16b. Wskaźnik do funkcji 16c. Operatory new i delete 16d. Referencje 17. Pliki źródłowe i nagłówkowe Zadania powtórzeniowe 18. Class - klasy 19. Konstruktor , destruktor 20. Argumenty domyślne, przeciążanie (przeładowanie) funkcji i operatorów C++ FAQ: 01. Operacje na plikach, odczyt/zapis02. Nie działa mi polecenie gotoxy() co robić ? 03. Jaki podręcznik do nauki C++ ? ostatnia aktualizacja: 29.08.2005 KONSTRUKTOR , DESTRUKTOR
KONSTRUKTOR
Często zdarza się sytuacja, że po utworzeniu obiektu jakiejś klasy inicjalizujemy standardowymi wartościami jego zmienne. ![]() Jak widać obiekt został utworzony i potem do każdej zmiennej przypisujemy jakąś wartość, rozwiązanie jak najbardziej poprawne ale nie zawsze najbardziej efektywne. Czasem może zdarzyć się, że zmiennych jest dosyć dużo i na dodatek zawsze są do nich wpisywane (zawsze = dla każdego nowego obiektu danej klasy) takie same wartości. Tu z pomocą przychodzi nam konstruktor. Co to właściwie jest? Konstruktor to "zwykła" funkcja z dwoma zastrzeżeniami: - konstruktor nie zwraca rezultatu swojego działania (więc nie podajemy zwracanego typu bo go po prostu nie ma) - konstruktor danej klasy musi nazywać się tak jak klasa (właśnie tym różni się od innych funkcji danej klasy). ![]() Przykład odrobinę się powiększył, pojawiła się deklaracja (1) oraz definicja (2) konstruktora. Jak na razie nie widać żadnych korzyści z zastosowania konstruktora ale to za moment ulegnie zmianie. ![]() Teraz sytuacja jest już jasna. Konstruktor jest PIERWSZĄ funkcją jaka jest automatycznie uruchamiana w momencie tworzenia nowego obiektu danej klasy więc jest idealnym miejscem do inicjalizowania jego zmiennych (zarówno publicznych jak i prywatnych). Stosowanie konstruktora do początkowej inicjalizacji zmiennych pozwoli nam zaoszczędzić sporo czasu na szukaniu błędów które bardzo często pojawiają się przy braku inicjalizacji zmiennych. Oczywiście możemy próbować o wszystkim pamiętać ale w miarę rozrastania się naszego programu i w miarę zwiększania się ilości zmiennych niestety prędzej czy później zdarzy się sytuacja, że o czymś zapomnimy. Niby wszystko pięknie ale co w sytuacji gdy wartości zmiennych będą się różniły dla poszczególnych obiektów danej klasy? Powyższy przykład jest w wielu przypadkach wystarczający ale... no właśnie zawsze pojawia się "ale". Rozwiązaniem są parametry. Konstruktor tak jak każda funkcja może przyjmować parametry. ![]() Jak widzimy w prosty sposób można podać własne dane do inicjalizacji zmiennych obiektu. Dopuszczalna jest także sytuacja gdy część zmiennych inicjalizujemy wartościami standardowymi a część przekazujemy jako parametry. ![]() Dwie zmienne inicjalizowane są przez paramery konstruktora natomiast trzecia zmienna inicjalizowana jest wartością stałą dla każdego z nowo tworzonych obiektów danej klasy. DESTRUKTOR Konstruktory zajmowały się "konstruowaniem" natomiast destruktor zajmuje się niszczeniem. Najprościej mówiąc, konstruktor "sprząta" po danym obiekcie klasy. Cechy główne destruktora: - nazwa identyczna jak nazwa klasy poprzedzona znaczkiem "~" (czymś musi się odróżniać od konstruktora :) ) - tak jak w konstruktorze, brak określenia zwracanego zwracanego rezultatu. ![]() Destruktor najczęściej służy do zwalniania obiektów które klasa tworzy w czasie swojego działania dynamicznie, najprostszym zastosowaniem destruktora jest zwolnienie pamięci. ![]() W konstruktorze przydzielamy pamięć na 100 elementów typu int (w celu uproszczenia przykładu pominąłem sprawdzanie czy pamięć została prawidłowo przydzielona - zakładam że tak), nie musimy już tego pilnować aby przy zakańczaniu programu zwolnić wcześniej zarezerwowaną pamięć, destruktor zrobi to za nas. Destruktory są wywoływane AUTOMATYCZNIE w momencie niszczenia obiektu danej klasy, nie musimy ich specjalnie włączać. Destruktor jest ZAWSZE wywoływany na końcu (jako ostatni) oznacza to, że po nim dany obiekt już nie istnieje. Sporo było mówione o niszczeniu obiektów danej klasy a w żadnym przykładzie nic takiego nie było pokazane. Obiekty są likwidowane gdy jest opuszczany zasięg ich ważności, dokładnie tak samo jak miało to miejsce w przypadku "zwykłych" zmiennych (patrz. lekcja 11). ![]() 1 - obiekt klasy jeszcze nie został utworzony, nie ma go 2 - obiekt jest tworzony , uruchamia się konstruktor przydzielając pamięć, jako, że nic więcej nie ma do zrobienia opuszczany jest zakres ważności ( wyjście po za nawiasy { }) , wywoływany jest destruktor który zwalnia wcześniej przydzieloną pamięć 3 - obiek klasu został już zlikwidowany, nie ma go Podsumowując: konstruktory wywoływane są zawsze jako pierwsze i niejako tworzą/przygotowują nam obiekt danej klasy do pracy, natomiast destruktory zawsze wywoływane są jako ostatnie i służą do "sprzątania" po obiekcie. |
|