102 Godzina 7
Linia 33 w listingu 7.4. rozpoczyna główny blok programu. Aż do linii 35 nie została wykonana żadna operacja na pamięci. Poinformowaliśmy jedynie kompilator, jak ma tworzyć obiekt typu Punkt i Prostokąt.
W linii 36 definiujemy obiekt klasy Prostokąt i przekazujemy wartości jego współrzędnych.
W linii 38 tworzymy zmienną lokalną Pole. Zmienna ta będzie przechowywać obliczoną wartość pola stworzonego prostokąta. Zmienna Pole jest inicjalizowana wartością zwróconą przez funkcję PobierzPole (), należącą do klasy Prostokąt.
Każdy klient klasy Prostokąt może stworzyć dowolny obiekt tej klasy i odczytać pole figury bez zagłębiania się w detale implementacji.
Aby dowiedzieć się jak wykorzystywać klasę Prostokąt wystarczy spojrzeć na jej plik nagłówkowy. Wiemy, że funkcja PobierzPole () zwraca wartość typu int, a jak ona to robi, to już nas zupełnie nie obchodzi. Autor klasy Prostokąt może dowolnie modyfikować funkcję PobierzPole (), nie będzie to miało wpływu na działanie programów wykorzystujących klasę.
W ciągu ostatniej godziny poznałeś tajniki tworzenia klas.
Nauczyłeś się tworzyć funkcje wewnętrzne nie zmieniające zawartości klasy (const). Wiesz na czym polega różnica pomiędzy interfejsem klasy a implementacją jej metod.
Dobrym zwyczajem programistycznym jest separowanie interfejsu (deklaracji) klasy w pliku nagłówkowym. Pliki takie zazwyczaj mają rozszerzenie .HPP. Implementację metod umieszcza się w plikach z rozszerzeniem .CPP.
P: Jeśli użycie const powoduje błędy kompilacji, to dlaczego nie mogę pominąć słowa const i uważać, aby nie popełnić błędu?
O: Jeśli logicznym jest, że funkcja wewnętrzna nie powinna zmieniać zawartości klasy to użycie const pozwala wykryć w fazie kompilacji wszystkie błędy polegające na nieuwadze programisty. Np. funkcja PobierzWiek () nie powinna zmienić żadnej danej w klasie Kot, ale jeśli pomylisz się i napiszesz (jest to bardzo częsta pomyłka):
if (jegoWiek = 100) cout « "Hej! Masz juz 100 lat!\n";
to dzięki zadeklarowaniu funkcji PobierzWiek () jako const kompilator poinformuje Cię, że popełniłeś błąd. Chciałeś zapewne sprawdzić, czy zmienna jegoWiek jest równa 100 ale przez pomyłkę przypisujesz 100 do tej zmiennej. Ponieważ ewidentnie jest to zmiana zawartości klasy, a zadeklarowałeś, że funkcja ma nic nie zmieniać w klasie to otrzymasz komunikat błędu. Będziesz mógł poprawić go już w fazie kompilacji.
Linia 33 w listingu 7.4. rozpoczyna główny blok programu. Aż do linii 35 nie została wykonana żadna operacja na pamięci. Poinformowaliśmy jedynie kompilator, jak ma tworzyć obiekt typu Punkt i Prostokąt.
W linii 36 definiujemy obiekt klasy Prostokąt i przekazujemy wartości jego współrzędnych.
W linii 38 tworzymy zmienną lokalną Pole. Zmienna ta będzie przechowywać obliczoną wartość pola stworzonego prostokąta. Zmienna Pole jest inicjalizowana wartością zwróconą przez funkcję PobierzPole (), należącą do klasy Prostokąt.
Każdy klient klasy Prostokąt może stworzyć dowolny obiekt tej klasy i odczytać pole figury bez zagłębiania się w detale implementacji.
Aby dowiedzieć się jak wykorzystywać klasę Prostokąt wystarczy spojrzeć na jej plik nagłówkowy. Wiemy, że funkcja PobierzPole () zwraca wartość typu int, a jak ona to robi, to już nas zupełnie nie obchodzi. Autor klasy Prostokąt może dowolnie modyfikować funkcję PobierzPole (), nie będzie to miało wpływu na działanie programów wykorzystujących klasę.
W ciągu ostatniej godziny poznałeś tajniki tworzenia klas.
Nauczyłeś się tworzyć funkcje wewnętrzne nie zmieniające zawartości klasy (const). Wiesz na czym polega różnica pomiędzy interfejsem klasy a implementacją jej metod.
Dobrym zwyczajem programistycznym jest separowanie interfejsu (deklaracji) klasy w pliku nagłówkowym. Pliki takie zazwyczaj mają rozszerzenie .HPP. Implementację metod umieszcza się w plikach z rozszerzeniem .CPP.
P: Jeśli użycie const powoduje błędy kompilacji, to dlaczego nie mogę pominąć słowa const i uważać, aby nie popełnić błędu?
O: Jeśli logicznym jest, że funkcja wewnętrzna nie powinna zmieniać zawartości klasy to użycie const pozwala wykryć w fazie kompilacji wszystkie błędy polegające na nieuwadze programisty. Np. funkcja PobierzWiek () nie powinna zmienić żadnej danej w klasie Kot, ale jeśli pomylisz się i napiszesz (jest to bardzo częsta pomyłka):
if (jegoWiek = 100) cout « "Hej! Masz juz 100 lat!\n";
to dzięki zadeklarowaniu funkcji PobierzWiek () jako const kompilator poinformuje Cię, że popełniłeś błąd. Chciałeś zapewne sprawdzić, czy zmienna jegoWiek jest równa 100 ale przez pomyłkę przypisujesz 100 do tej zmiennej. Ponieważ ewidentnie jest to zmiana zawartości klasy, a zadeklarowałeś, że funkcja ma nic nie zmieniać w klasie to otrzymasz komunikat błędu, Będziesz mógł poprawić go już w fazie kompilacji.