Zaawansowane wykorzystanie wskaźników 149
Gdyby to co powiedzieliśmy dotychczas wyczerpało zastosowanie wskaźnika this, to jego istnienie byłoby nieco mało uzasadnione. Wskaźnik this przechowuje adres obiektu. Może być, dzięki temu, bardzo pożytecznym narzędziem.
Praktyczne zastosowanie wskaźnika this poznamy w niedalekiej przyszłości, w dalszej części książki, kiedy będziemy omawiać przeciążanie operatorów. Teraz musisz jedynie wiedzieć, że istnieje coś takiego jak this, i że jest to wskaźnik obiektu na samego siebie.
Nie musisz tworzyć ani kasować wskaźnika this. Zajmuje się tym kompilator.
Trudnym do lokalizacji źródłem błędów i przyczyną wielu programistycznych problemów są zgubione wskaźniki. Taki wskaźnik powstaje, kiedy wywołasz na wskaźniku do istniejącego obszaru instrukcję delete, co powoduje zwolnienie obszaru wskazywanego przez ten wskaźnik, i próbujesz ponownie odwołać się do adresu zawartego we wskaźniku, bez ponownego przypisania mu nowego miejsca w pamięci. Przypomnij sobie porównanie z programowalnym telefon. To tak, jakby twoi znajomi się wyprowadzili, a ty nadal byś naciskał przyciski, którym były przypisane ich poprzednie, domowe numery telefonów. Możliwe, że nie stanie się nic złego, ale jeśli któryś z numerów byłby przepisany do fabryki uzbrojenia to jeden Twój telefon mógłby wysadzić całe miasto w powietrze.
Krótko mówiąc, nigdy nie odwołuj się do adresów wskazywanych przez wskaźniki, po skasowaniu ich za pomocą delete. Mimo że wskaźnik nadal zawiera adres obszaru w pamięci, to nie jest on już zarezerwowany i kompilator może tam umieszczać nowe dane, których nieświadoma zmiana może spowodować błędne działanie programu, a nawet zawieszenie się komputera. Takie błędy są bardzo trudne do wychwycenia i zlokalizowania i stanowią swoiste bomby zegarowe. Dla bezpieczeństwa, zawsze po użyciu delete przypisz do wskaźnika wartość nuli ( 0 ).
Deklarując wskaźnik możesz przed lub po nazwie typu wykorzystać słowo kluczowe const. Oto przykładowe, poprawne deklaracje wykorzystujące const:
const int * pJeden; int * const pDwa; const int * const pTrzy;
pJeden jest wskaźnikiem na stałą typu int. Wartość ta nie może zostać zmieniona z wykorzystaniem tego wskaźnika. Oznacza to, że nie możesz napisać np. tak:
Gdyby to co powiedzieliśmy dotychczas wyczerpało zastosowanie wskaźnika this, to jego istnienie byłoby nieco mało uzasadnione. Wskaźnik this przechowuje adres obiektu. Może być, dzięki temu, bardzo pożytecznym narzędziem.
Praktyczne zastosowanie wskaźnika this poznamy w niedalekiej przyszłości, w dalszej części książki, kiedy będziemy omawiać przeciążanie operatorów. Teraz musisz jedynie wiedzieć, że istnieje coś takiego jak this, i że jest to wskaźnik obiektu na samego siebie.
Nie musisz tworzyć ani kasować wskaźnika this. Zajmuje się tym kompilator.
Trudnym do lokalizacji źródłem błędów i przyczyną wielu programistycznych problemów są zgubione wskaźniki. Taki wskaźnik powstaje, kiedy wywołasz na wskaźniku do istniejącego obszaru instrukcję delete, co powoduje zwolnienie obszaru wskazywanego przez ten wskaźnik, i próbujesz ponownie odwołać się do adresu zawartego we wskaźniku, bez ponownego przypisania mu nowego miejsca w pamięci.
Przypomnij sobie porównanie z programowalnym telefon. To tak, jakby twoi znajomi się wyprowadzili, a ty nadal byś naciskał przyciski, którym były przypisane ich poprzednie, domowe numery telefonów. Możliwe, że nie stanie się nic złego, ale jeśli któryś z numerów byłby przepisany do fabryki uzbrojenia to jeden Twój telefon mógłby wysadzić całe miasto w powietrze.
Krótko mówiąc, nigdy nie odwołuj się do adresów wskazywanych przez wskaźniki, po skasowaniu ich za pomocą delete. Mimo że wskaźnik nadal zawiera adres obszaru w pamięci, to nie jest on już zarezerwowany i kompilator może tam umieszczać nowe dane, których nieświadoma zmiana może spowodować błędne działanie programu, a nawet zawieszenie się komputera. Takie błędy są bardzo trudne do wychwycenia i zlokalizowania i stanowią swoiste bomby zegarowe. Dla bezpieczeństwa, zawsze po użyciu delete przypisz do wskaźnika wartość nuli ( 0 ).
Deklarując wskaźnik możesz przed lub po nazwie typu wykorzystać słowo kluczowe const. Oto przykładowe, poprawne deklaracje wykorzystujące const:
const int * pjeden; int * const pDwa; const int * const pTrzy;
NOWY TERMIN
pjeden jest wskaźnikiem na stalą typu int. Wartość ta nie może zostać zmieniona z wykorzystaniem tego wskaźnika. Oznacza to, że nie możesz napisać np. tak: