188 Godzina 13
Programy 13.1 i 13.2 robiły to samo. Jednak program 13.1, napisany z wykorzystaniem przeciążenia funkcji, jest prostszy i bardziej intuicyjny. Dodatkowym argumentem, przemawiającym za rozwiązaniem prezentowanym w programil3.1, jest łatwość rozbudowy. Jeśli programista chciałby dodać trzeci wariant funkcji, to nie ma problemu — wystarczy dopisać kolejną realizację. Program 13.2 nie posiada tej zalety, wartość domyślna stanie się bezużyteczne w przypadku nowych wariantów.
Jak zatem zdecydować czy wykorzystać przeciążanie funkcji czy wartości domyślne. Oto kilka głównych reguł:
Decyduj się na przeciążanie funkcji jeśli:
□ Nie ma żadnej sensownej wartości domyślnej.
□ Wykorzystujesz różne algorytmy w zależności od liczby parametrów.
□ Musisz obsługiwać różne typy w liście parametrów.
Jak już mówiliśmy w rozdziale 6, „Proste klasy”, jeśli nie zadeklaruje się jawnie konstruktora klasy to przy każdym tworzeniu obiektu klasy wywoływany jest konstruktor domyślny, nie pobierający argumentów i nie wykonujący żadnych operacji. Możesz stworzyć własny konstruktor domyślny, czyli ten nie pobierający żadnych argumentów i wykorzystać go do inicjalizowania obiektów.
Konstruktor dostarczany przez kompilator nazywany jest domyślnym ale konwencja mówi, że każdy konstruktor nie pobierający argumentów jest domyślny. Pojawia się tutaj pewne zagmatwanie, ale zazwyczaj z kontekstu wynika, o który konstruktor chodzi.
Pamiętaj, że jeśli stworzysz jakikolwiek konstruktor, to kompilator nie stworzy już konstruktora domyślnego. Zatem jeśli chcesz mieć konstruktor nie pobierający argumentów i stworzyłeś już inne konstruktory, to musisz go napisać samodzielnie!
Konstruktor służy do inicjalizowania obiektu. Np. konstruktor klasy Prostokąt tworzy w pamięci pojedynczy prostokąt. Przed wywołaniem konstruktora w pamięci istniał tylko zarezerwowany obszar. Po wykonaniu konstruktora obszar ten stał się gotowym do użycia obiektem.
Konstruktory, podobnie jak wszystkie inne metody klasy, mogą być przeciążane. Możliwość przeciążania konstruktorów daje programiście wiele możliwości.
Np. możesz stworzyć klasę Prostokąt posiadającą dwa konstruktory: pierwsze, pobierający dwa parametry określające wymiary, drugi, bez parametrów, tworzący prostokąt o wymiarach domyślnych. Kompilator wybierze konstruktor na podstawie typu i liczby parametrów, tak jak w przypadku zwykłych funkcji.
W przeciwieństwie do konstruktorów, destruktorów przeciążać nie można. Każdy destruktor, z definicji, tworzony jest tak samo: nazwa klasy poprzedzona znakiem tyldy (~). Destruktor nie pobiera żadnych parametrów.
Programy 13.1 i 13.2 robiły to samo. Jednak program 13.1, napisany z wykorzystaniem przeciążenia funkcji, jest prostszy i bardziej intuicyjny. Dodatkowym argumentem, przemawiającym za rozwiązaniem prezentowanym w programil3.1, jest łatwość rozbudowy. Jeśli programista chciałby dodać trzeci wariant funkcji, to nie ma problemu - wystarczy dopisać kolejną realizację. Program 13.2 nie posiada tej zalety, wartość domyślna stanie się bezużyteczne w przypadku nowych wariantów.
Jak zatem zdecydować czy wykorzystać przeciążanie funkcji czy wartości domyślne. Oto kilka głównych reguł:
Decyduj się na przeciążanie funkcji jeśli:
□ Nie ma żadnej sensownej wartości domyślnej.
□ Wykorzystujesz różne algorytmy w zależności od liczby parametrów.
□ Musisz obsługiwać różne typy w liście parametrów.
Jak już mówiliśmy w rozdziale 6, „Proste klasy”, jeśli nie zadeklaruje się jawnie konstruktora klasy to przy każdym tworzeniu obiektu klasy wywoływany jest konstruktor domyślny, nie pobierający argumentów i nie wykonujący żadnych operacji. Możesz stworzyć własny konstruktor domyślny, czyli ten nie pobierający żadnych argumentów i wykorzystać go do inicjalizowania obiektów.
Konstruktor dostarczany przez kompilator nazywany jest domyślnym ale konwencja mówi, że każdy konstruktor nie pobierający argumentów jest domyślny. Pojawia się tutaj pewne zagmatwanie, ale zazwyczaj z kontekstu wynika, o który konstruktor chodzi.
Pamiętaj, że jeśli stworzysz jakikolwiek konstruktor, to kompilator nie stworzy już konstruktora domyślnego. Zatem jeśli chcesz mieć konstruktor nie pobierający argumentów i stworzyłeś już inne konstruktory, to musisz go napisać samodzielnie!
Konstruktor służy do inicjalizowania obiektu. Np. konstruktor klasy Prostokąt tworzy w pamięci pojedynczy prostokąt. Przed wywołaniem konstruktora w pamięci istniał tylko zarezerwowany obszar. Po wykonaniu konstruktora obszar ten stal się gotowym do użycia obiektem.
Konstruktory. podobnie jak wszystkie inne metody klasy, mogą być przeciążane. Możliwość przeciążania konstruktorów daje programiście wiele możliwości.
Np. możesz stworzyć klasę Prostokąt posiadającą dwa konstruktory: pierwsze, pobierający dwa parametry określające wymiary, drugi, bez parametrów, tworzący prostokąt o wymiarach domyślnych. Kompilator wybierze konstruktor na podstawie typu i liczby parametrów, tak jak w przypadku zwykłych funkcji.
W przeciwieństwie do konstruktorów, destruktorów przeciążać nie można. Każdy destruktor, z definicji, tworzony jest tak samo: nazwa klasy poprzedzona znakiem tyldy (~). Destruktor nie pobiera żadnych parametrów.