Poznaj C++ w$ godziny0232

Poznaj C++ w$ godziny0232



Tablice 223

Usuwanie tablicy ze sterty

Rodzina jest wskaźnikiem do tablicy na stercie. Kiedy w linii 33 odwołujemy się do wskaźnika pKot, to wstawiamy do tablicy obiekt klasy KOT (dlaczego nie? tablica znajduje się przecież na stercie). Ale pKot jest w następnej iteracji wykorzystywany do stworzenia kolejnego obiektu. Czy nie pojawia się tutaj niebezpieczeństwo utraty wskaźników do obiektów w tablicy?

Byłby to wielki problem, gdyby nie fakt, że skasowanie wskaźnika Rodzina (za pomocą delete) zwolni całą pamięć zarezerwowaną dla tablicy. Kompilator potrafi usunąć każdy obiekt z tablicy i zwolnić zajmowaną pamięć.

Żeby się o tym przekonać, zmień w liniach 26, 29 i 36 rozmiar tablicy z 500 na 10 i usuń komentarz z linii 21. Uruchom program, a przekonasz się, że w momencie jego zakończenia zostanie wywołany destruktor każdego ze stworzonych obiektów.

Jeśli tworzysz obiekt za pomocą new to zawsze musisz go usunąć za pomocą delete. Podobnie, gdy tworzysz tablicę z wykorzystaniem new <klasa> [rozmiar] , to kasujesz ją potem za pomocą delete [ ]. Nawiasy są informacją dla

kompilatora, że skasowaniu ma ulec cała tablica.

Jeśli pominąłbyś nawiasy, to usunięty zostałby tylko pierwszy element tablicy. Możesz to sprawdzić. Usuń nawiasy w linii 39 i komentarz w linii 21. Po uruchomieniu programu zobaczysz, że destruktor zostanie wywołany tylko jeden raz. Gratulacje! Właśnie ubyło Ci pamięci!

ZAWSZE

NIGDY

Zawsze pamiętaj, że n elementowa tablica jest indeksowana od 0 do n-1. Zawsze wykorzystuj indeksowanie tylko z tymi wskaźnikami, które przechowują adresy tablic.

Nigdy nie zapisuj ani nie odczytuj elementów spoza końca tablicy.

Nigdy nie myl tablicy wskaźników ze wskaźnikiem do tablicy.

Tablice znaków (char)

Łańcuch to ciąg znaków. Dotychczas wykorzystywaliśmy tylko stale łańcuchy. Jednym z nich był:

cout « "Hello world!\n"

W C++ łańcuch jest reprezentowany przez tablicę znaków zakończoną wartością zero. Możesz zadeklarować łańcuch tak jak każdą tablicę. Np.:

char Czesc[]={ ’H' , 'e' , •!' ,    , 'o' ,1 'W , 'o' , 'r', '1', 'd', '\0' };

Usuwanie tablicy ze sterty

Rodzina jest wskaźnikiem do tablicy na stercie. Kiedy w linii 33 odwołujemy się do wskaźnika pKot, to wstawiamy do tablicy obiekt klasy KOT (dlaczego nie? tablica znajduje się przecież na stercie). Ale pKot jest w następnej iteracji wykorzystywany do stworzenia kolejnego obiektu. Czy nie pojawia się tutaj niebezpieczeństwo utraty wskaźników do obiektów w tablicy?

Byłby to wielki problem, gdyby nie fakt, że skasowanie wskaźnika Rodzina (za pomocą delete) zwolni całą pamięć zarezerwowaną dla tablicy. Kompilator potrafi usunąć każdy obiekt z tablicy i zwolnić zajmowaną pamięć.

Żeby się o tym przekonać, zmień w liniach 26, 29 i 36 rozmiar tablicy z 500 na 10 i usuń komentarz z linii 21. Uruchom program, a przekonasz się, że w momencie jego zakończenia zostanie wywołany destruktor każdego ze stworzonych obiektów. Jeśli tworzysz obiekt za pomocą new to zawsze musisz go usunąć za pomocą delete. Podobnie, gdy tworzysz tablicę z wykorzystaniem new <klasa>[rozmiar], to kasujesz ją potem za pomocą delete [ ]. Nawiasy są informacją dla kompilatora, że skasowaniu ma ulec cała tablica.

Jeśli pominąłbyś nawiasy, to usunięty zostałby tylko pierwszy element tablicy. Możesz to sprawdzić. Usuń nawiasy w linii 39 i komentarz w linii 21. Po uruchomieniu programu zobaczysz, że destruktor zostanie wywołany tylko jeden raz. Gratulacje! Właśnie ubyło Ci pamięci!

ZAWSZE

NIGDY

Zawsze pamiętaj, że n elementowa tablica jest indeksowana od 0 do n-1.

Zawsze wykorzystuj indeksowanie tylko z tymi wskaźnikami, które przechowują adresy tablic.

Nigdy nie zapisuj ani nie odczytuj elementów spoza końca tablicy.

Nigdy nie myl tablicy wskaźników ze wskaźnikiem do tablicy.

Tablice znaków (char)

Łańcuch to ciąg znaków. Dotychczas wykorzystywaliśmy tylko stale łańcuchy. Jednym z nich był:

cout « "Hello world!\n"

W C++ łańcuch jest reprezentowany przez tablicę znaków zakończoną wartością zero. Możesz zadeklarować łańcuch tak jak każdą tablicę. Np.:

char Czesc[]={'H',’e’,,’1','o','    'W','o’,'r’,'1',’d','\0' };


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0222 Tablice 213 Tablice
Poznaj C++ w$ godziny0226 Tablice 217 Jednak taka reprezentacja mniej przystaje do rzeczywistości ni
Poznaj C++ w$ godziny0228 Tablice 219 W książce omówimy* tablice wskaźników, tablice tworzone na ste
Poznaj C++ w$ godziny0230 Tablice 221Wskaźnik do tablicy a tablica wskaźników Rozpatrzmy trzy różne
Poznaj C++ w$ godziny0234 Tablice 225 Żeby rozwiązać powstałe problemy, musimy wykorzystać specjalną
Poznaj C++ w$ godziny0236 Tablice 227 jEFEKT DZIAŁANIA: Lancuchl: Nikt nie jest sam Lancuch2: Nikt n
Poznaj C++ w$ godziny0023 Zaczynamy 7 C++ to nie tylko lepsze C Prawdą jest, że C++ to rozbudowane C
Poznaj C++ w$ godziny0251 Dziedziczenie 243 Zauważ, że w linii 74, domyślny konstruktor klasy Pies w
Poznaj C++ w$ godziny0108 Więcej o klasach 95 Więcej o klasach 95Dlaczego wykorzystywać kompilator d
MENSXP.COM Kandydat z pendżabu ptacze po dostaniu 5 gtosów, mówi ze w jego rodzinie jest 9 osób
s085 (2) Drukowanie plików 85 4. I Jpewnij się, że port szeregowy jest obsługiwany przez system - na
20 PISMO PG lu załogi. Po wtóre, że jego model jest przeznaczony do montażu bezpośrednio na pokładzi
101 centralne Powodem tego. że przyrost naturalny jest większy w mieście niż na wsi jest silny odpły

więcej podobnych podstron