Poznaj C++ w$ godziny0160

Poznaj C++ w$ godziny0160



Zaawansowane wykorzystanie wskaźników 149

Do czego służy wskaźnik this

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.

Zgubione wskaźniki

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 ).

Wskaźniki const

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:

Do czego służy wskaźnik this

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.

Zgubione wskaźniki

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 ).

Wskaźniki const

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:


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0158 Zaawansowane wykorzystanie wskaźników 147 32:    } 33: 34:
Poznaj C++ w$ godziny0162 Zaawansowane wykorzystanie wskaźników 151 Zaawansowane wykorzystanie wskaź
Poznaj C++ w$ godziny0156 145Zaawansowane wykorzystanie wskaźników W liniach 6-13 deklarujemy klasę
Poznaj C++ w$ godziny0182 Zaawansowane referencje i wskaźniki 171 int PobierzWiek() const { return j
Poznaj C++ w$ godziny0184 Zaawansowane referencje i wskaźniki 173 Ponieważ wiemy, że obiekt nie będz
Poznaj C++ w$ godziny0190 Zaawansowane referencje i wskaźniki 179 ZAWSZE NIGDY Zawsze przekazuj p
Poznaj C++ w$ godziny0119 Zaawansowane sterowanie programem 107Pętle while Pętla while pozwala na po
Poznaj C++ w$ godziny0121 Zaawansowane sterowanie programem 109 W liniach 12-15 wprowadzamy wartości
Poznaj C++ w$ godziny0123 Zaawansowane sterowanie programem 111 W linii 32 obliczana jest reszta z d
Poznaj C++ w$ godziny0125 Zaawansowane sterowanie programem Listing 8.6. Pomijanie pętli while 1:
Poznaj C++ w$ godziny0127 Zaawansowane sterowanie programem 115Listing 8.8. Jeszcze raz pętla while
Poznaj C++ w$ godziny0129 Zaawansowane sterowanie programem 117Listing 8.10. Demonstracja wielokrotn
Poznaj C++ w$ godziny0131 Zaawansowane sterowanie programem 119EFEKT DZIAŁANIA: No to ile razy sie p
Poznaj C++ w$ godziny0133 Zaawansowane sterowanie programem 121 Jaki znak?
Poznaj C++ w$ godziny0135 Zaawansowane sterowanie programem 153 20:    break; 21: &nb
Poznaj C++ w$ godziny0180 169Zaawansowane referencje i wskaźniki 39:    FunkcjaDruga(
Poznaj C++ w$ godziny0186 175Zaawansowane referencje i wskaźniki Wskaźnik plnt jest deklarowany i in
Poznaj C++ w$ godziny0188 177Zaawansowane referencje i wskaźniki 18:    ZwyklyKot::Zw
Poznaj C++ w$ godziny0194 Zaawansowane funkcje 185 57: Prost.RysujKsztalt(); 58: cout «

więcej podobnych podstron