Dane szczegółowe książki
Język C++: praktyczne wskazówki / Hyman, Michael I. (1965-); Vaddadi, Phani (1965-)
Tytuł
Język C++: praktyczne wskazówki
Tytuł oryginału
Mike and phani's essential C++ techniques
Wydawnictwo
Warszawa: LT&P, 2001
ISBN
8387115150
Hasła przedmiotowe
Informacje dodatkowe
Książka zawiera dołączoną płytę CD
Spis treści
pokaż spis treści
Wstęp 13
I Wskazówki 15
1 Na początek dobry projekt 19
Określanie problemu 20
Zasada 1-3-5 20
Rozwiązanie przy szukaniu problemu 21
Problem przy szukaniu rozwiązania 22
Szukanie rozwiązania i problemu 22
Prostota to klucz do sukcesu 22
Znaczenie dobrego projektu 23
Klient ma zawsze racje 23
Projektowanie to proces cykliczny 24
Kodowanie to też proces cykliczny 24
Pracować sprytniej a nie dłużej 24
Co dwie głowy to nie jedna 25
Dwukrotne mierzenie przed cięciem 25
Kiedy powiedzieć dość 25
Wybór właściwych algorytmów i struktur danych 26
2 Całkiem rozsądne zwyczaje 27
Zachowywanie ostrożności przy kopiowaniu fragmentów kodu 28
Inicjalizowanie zmiennych lokalnych 29
Sprawdzanie argumentów 30
Sprawdzanie kodów zwrotnych 31
Uniemożliwianie dzielenia przez 0 32
Uniemożliwianie obliczania reszty z dzielenia przez 0 33
Zapewnianie zmian licznika pętli 33
0 = a zamiast a = 0 34
Strażnicy nagłówków 35
Liczenie bajtów w funkcjach wewnętrznych 36
Liczenie bajtów w instrukcji mempcy 36
Const zamiast stałych liczbowych 37
Stałe const są wstępnie obliczane 38
Deklaracje #deflne zamiast const 38
Asercje zamiast lub oprócz komentarzy 39
Obsługiwanie wyjątków nawet po użyciu asercji 40
Ostrożność przy wybieraniu typów ze znakiem lub bez znaku 41
Ostrożność przy łączeniu liczb ze znakiem i liczb bez znaku 41
Nawiasy tam, gdzie są potrzebne 42
Sprawdzanie argumentów 43
Traktowanie ostrzeżeń zawsze jako błędów 44
Używanie zawsze co najmniej trzeciego poziomu ostrzeżeń 45
Odwrotny ukośnik (\) w napisach 45 ,
Ostrożność przy fączeniu C i C++ 46
Sprawdzanie, czy stała jest już zdefiniowana 4fi
Bycie świadomym tego, co robią funkcje {przynajmniej te,
których się używa) 47
Gwarantowanie, że napisy są zakończone znakiem pustym 48
Sprawdzanie rzeczywistego rozmiaru 49
Funkcje bezpośrednie zamiast makropoleceń 50
Kod generowany przez kompilator 53
Konstruktory i destruktory są tworzone automatycznie 54
Izolowanie operacji new w celu zaoszczędzenia miejsca 56
Przeciążanie operacji new wraz z przeciążaniem operacji delete 57
Operator dodawania wprowadza duży narzut 58
Wskaźniki i pamięć 61
Sprawdzanie, czy pamięć przydzielono pomyślnie 62
Zwalnianie pamięci tylko raz 62
Sprawdzanie przed zamianą, czy można przydzielić pamięć 63
Przygotowywanie się na wielokrotne wywołania metod alokacji buforów 64
Niezwracanie wskaźników do zmiennych automatycznych 65
Inicjalizowanie zmiennych do zawsze znanego stanu 66
Unikanie kopii wskazujących na siebie 67
Używanie deklaracji const * 68
Unikanie błędów podczas użycia deklaracji const 68
Inteligentne wskaźniki 69
Inteligentne wskaźniki do obiektów 70
Własne alokatory pamięci i inteligentne wskaźniki 71
Dbanie o rozmiar buforów 71
Tworzenie menedżera pamięci wykrywającego straty 72
Globalne i lokalne alokatory pamięci 72
Tablice 73
Polecenia delete (| w tablicach 74
Unikanie za małych indeksów 74
Unikanie za dużych indeksów 75
coś|K] oznacza to samo, co coś.operator[ ] (K) 76
Tablica jest wskaźnikiem 77
Klasy 79
Tnicjalizowanie zmiennych składowych 80
Listy inicjałizacyjne 81
Nieinicjalizowanie stałych wewnątrz konstruktora 82
Stałe składowe wymagają przydzielenia pamięci 83
Przydzielanie pamięci d!a stałych niestatycznych w obszarze kodu programu .. 84
Ochrona zmiennych składowych przed dostępem z zewnątrz 85
Prywatne konstruktory i destruktory 86
Korzystanie z informacji o typach uzyskiwanej podczas wykonywania
programu 87
Przeciążanie operatora przypisania podczas przydzielania pamięci 88
Ochrona przed wywołaniem się operatorów na sobie samych 90
Sprawdzanie zbyt wielu parametrów to zbyt wiele 91
Tworzenie stałych operatorów 93
Prywatne wywodzenie klasy pochodnej 94
Sprawdzanie rozmiaru klasy lub struktury 95
Dziedziczenie zamiast unii 96
Inicjalizowanie w unii 98
Nierzutowanie na klasę pochodną 100
Używanie zmiennych składowych po usunięciu wskaźnika this 101
Abstrakcyjne klasy podstawowe 103
Kompilator sprawdza konkretyzację abstrakcyjnej klasy podstawowej 104
Projektowanie klas podstawowych spodziewających się implementacji
w klasie pochodnej 106
Dziedziczenie wymaga pamięci 108
Wielodziedziczenie po abstrakcyjnych klasach podstawowych nie powoduje
niejednoznaczności 109
Konstruktory 113
Inicjalizowanie zmiennych składowych 114
Argumenty domyślne pozwalająna zmniejszenie liczby konstruktorów 115
Tworzenie prywatnych konstruktorów 116
Tworzenie konstruktora kopiowania podczas przydzielania pamięci 118
Dbanie o kopiowanie przydzielonej pamięci w wypadku utworzenia
konstruktora kopiowania 120
Utworzenie wirtualnych destruktorów w wypadku spodziewanego
dziedziczenia 122
Jawne określanie używanego konstruktora w wypadku utworzenia kilku
konstruktorów 124
Dziedziczenie 127
Być kontra mieć 128
Zasady dotyczące zasięgu 129
Wielodziedziczenie może powodować niejednoznaczność 132
wskazówki
10 Przeciążanie operatorów 135
Różnica między operatorami przedrostkowymi a przyrostkowymi 136
Ostrożność przy przeciążaniu operatorów 136
Zachowywanie znaczenia operatorów 137
Przeciążanie operatora = w wypadku spodziewanych przypisań w klasie 137
Operatory mogą wykonywać więcej działań niż to się wydaje 139
Nietworzenie odwołań do zmiennych lokalnych 141
11 Szablony 143
Przechowywanie implementacji szablonu w innej klasie 144
12 Różne 147
Wstawianie zasobów graficznych 148
Sprawdzanie poprawności ścieżek 148
Nieumieszczanie na stosie obiektów ze zlic2aniem odwołań 149
Przekazywanie wstępnie przydzielonej pamięci do operatora new 150
Nakładanie się odwołań 152
13 Wydajność 155
Projekt jest ważniejszy od późniejszego dopracowywania kodu 156
Ustalanie, co trzeba poprawić 157
Oprzyrządowanie kodu 157
Zmniejszanie zbiom roboczego 158
Opcja minimalizowania rozmiaru 15?
Opóźnianie wczytywania 15$
Inwestowanie w dobre narzędzia 15C
Stosowanie szablonów znacznie powiększa kod 15^
W procesorze Pentium obliczenia zmiennopozycyjne są szybsze
niż obliczenia całko wito liczb o we 16(
Tabele wartości mogą zwiększyć wydajność 16<
Ostrożność przy używaniu funkcji bezpośrednich 16!
Sprawdzanie wygenerowanego kodu 16!
Przesunięcie bitowe jest szybsze niż dzielenie 16'
Obliczenia z użyciem wskaźników nie są szybsze niż przeglądanie tablic 16:
Przydzielanie pamięci jest kosztowne 16'
Ostrożność przy używaniu funkcji działających na napisach 16'
Unikanie biblioteki CRT 16
Funkcje wbudowane są szybsze niż funkcje CRT 16
14 Język maszynowy 17
Uzyskiwanie dostępu do zmiennych C++ z poziomu języka maszynowego 17
Kod w języku maszynowym działa tylko dla konkretnego procesora 17
Nieużywanie polecenia return w wypadku ustawienia rejestru EAX 17
Wyłączanie ostrzeżenia 4035 w wypadku ręcznego ustawiania rejestru EAX ... 17
Ponowne włączanie wyłączonych ostrzeżeń 17
15 Ogólne zagadnienia związane z usuwaniem błędów 177
Co to jest błąd? 178
Usuwanie usterek z projektu jeszcze przed rozpoczęciem kodowania 178
Sprawdzanie krok po kroku każdego nowego fragmentu kodu 179
Testowanie, gdy to możliwe, budowanie, gdy to konieczne 179
Testowanie danych, a nie kodu 1 SO
Sprawdzanie wygenerowanego kodu 1 SO
Planowanie testowania 1 SO
Testowanie wczesne i częste 181
Testowanie w niesprzyjających warunkach 181
Testowanie w skrajnych warunkach 181
Testowanie z punktu widzenia użytkownika 182
Testowanie z innymi aplikacjami 182
Testowanie na wszystkich platformach docelowych 182
Testowanie wersji ostatecznej i próbnej 183
16 Techniki usuwania usterek 185
Wczytywanie bibliotek DLL podczas usuwania usterek kodu 186
Wczytywanie plików wykonywalnych podczas usuwania usterek kodu 186
Rzutowanie danych 187
Zrzucanie rejestrów i ich znaczenie 187
Włączanie wyświetlania liczb szesnastkowych 188
Obsługiwanie wyjątków instrukcji 188
Zatrzymywanie w wypadku zmiany danych 189
Przeskakiwanie do wskazanej instrukcji 189
Tworzenie i stosowanie pliku odwzorowania pamięci 190
Analizowanie stosu wywołań 191
Zatrzymywanie stosu wywołań, gdy nie widać wszystkiego 194
II Przykładowe kody 197
17 Inteligentne wskaźniki 199
18 Zliczanie odwołań 20S
19 Tablice dynamiczne 211
20 Napisy 223
21 Działania na bitach 233
22 Sortowanie 243
23 Wyszukiwanie wyrażeń regularnych 249
Dodatek 261
O CD-ROM-ie 262
Skorowidz 263
I Wskazówki 15
1 Na początek dobry projekt 19
Określanie problemu 20
Zasada 1-3-5 20
Rozwiązanie przy szukaniu problemu 21
Problem przy szukaniu rozwiązania 22
Szukanie rozwiązania i problemu 22
Prostota to klucz do sukcesu 22
Znaczenie dobrego projektu 23
Klient ma zawsze racje 23
Projektowanie to proces cykliczny 24
Kodowanie to też proces cykliczny 24
Pracować sprytniej a nie dłużej 24
Co dwie głowy to nie jedna 25
Dwukrotne mierzenie przed cięciem 25
Kiedy powiedzieć dość 25
Wybór właściwych algorytmów i struktur danych 26
2 Całkiem rozsądne zwyczaje 27
Zachowywanie ostrożności przy kopiowaniu fragmentów kodu 28
Inicjalizowanie zmiennych lokalnych 29
Sprawdzanie argumentów 30
Sprawdzanie kodów zwrotnych 31
Uniemożliwianie dzielenia przez 0 32
Uniemożliwianie obliczania reszty z dzielenia przez 0 33
Zapewnianie zmian licznika pętli 33
0 = a zamiast a = 0 34
Strażnicy nagłówków 35
Liczenie bajtów w funkcjach wewnętrznych 36
Liczenie bajtów w instrukcji mempcy 36
Const zamiast stałych liczbowych 37
Stałe const są wstępnie obliczane 38
Deklaracje #deflne zamiast const 38
Asercje zamiast lub oprócz komentarzy 39
Obsługiwanie wyjątków nawet po użyciu asercji 40
Ostrożność przy wybieraniu typów ze znakiem lub bez znaku 41
Ostrożność przy łączeniu liczb ze znakiem i liczb bez znaku 41
Nawiasy tam, gdzie są potrzebne 42
Sprawdzanie argumentów 43
Traktowanie ostrzeżeń zawsze jako błędów 44
Używanie zawsze co najmniej trzeciego poziomu ostrzeżeń 45
Odwrotny ukośnik (\) w napisach 45 ,
Ostrożność przy fączeniu C i C++ 46
Sprawdzanie, czy stała jest już zdefiniowana 4fi
Bycie świadomym tego, co robią funkcje {przynajmniej te,
których się używa) 47
Gwarantowanie, że napisy są zakończone znakiem pustym 48
Sprawdzanie rzeczywistego rozmiaru 49
Funkcje bezpośrednie zamiast makropoleceń 50
Kod generowany przez kompilator 53
Konstruktory i destruktory są tworzone automatycznie 54
Izolowanie operacji new w celu zaoszczędzenia miejsca 56
Przeciążanie operacji new wraz z przeciążaniem operacji delete 57
Operator dodawania wprowadza duży narzut 58
Wskaźniki i pamięć 61
Sprawdzanie, czy pamięć przydzielono pomyślnie 62
Zwalnianie pamięci tylko raz 62
Sprawdzanie przed zamianą, czy można przydzielić pamięć 63
Przygotowywanie się na wielokrotne wywołania metod alokacji buforów 64
Niezwracanie wskaźników do zmiennych automatycznych 65
Inicjalizowanie zmiennych do zawsze znanego stanu 66
Unikanie kopii wskazujących na siebie 67
Używanie deklaracji const * 68
Unikanie błędów podczas użycia deklaracji const 68
Inteligentne wskaźniki 69
Inteligentne wskaźniki do obiektów 70
Własne alokatory pamięci i inteligentne wskaźniki 71
Dbanie o rozmiar buforów 71
Tworzenie menedżera pamięci wykrywającego straty 72
Globalne i lokalne alokatory pamięci 72
Tablice 73
Polecenia delete (| w tablicach 74
Unikanie za małych indeksów 74
Unikanie za dużych indeksów 75
coś|K] oznacza to samo, co coś.operator[ ] (K) 76
Tablica jest wskaźnikiem 77
Klasy 79
Tnicjalizowanie zmiennych składowych 80
Listy inicjałizacyjne 81
Nieinicjalizowanie stałych wewnątrz konstruktora 82
Stałe składowe wymagają przydzielenia pamięci 83
Przydzielanie pamięci d!a stałych niestatycznych w obszarze kodu programu .. 84
Ochrona zmiennych składowych przed dostępem z zewnątrz 85
Prywatne konstruktory i destruktory 86
Korzystanie z informacji o typach uzyskiwanej podczas wykonywania
programu 87
Przeciążanie operatora przypisania podczas przydzielania pamięci 88
Ochrona przed wywołaniem się operatorów na sobie samych 90
Sprawdzanie zbyt wielu parametrów to zbyt wiele 91
Tworzenie stałych operatorów 93
Prywatne wywodzenie klasy pochodnej 94
Sprawdzanie rozmiaru klasy lub struktury 95
Dziedziczenie zamiast unii 96
Inicjalizowanie w unii 98
Nierzutowanie na klasę pochodną 100
Używanie zmiennych składowych po usunięciu wskaźnika this 101
Abstrakcyjne klasy podstawowe 103
Kompilator sprawdza konkretyzację abstrakcyjnej klasy podstawowej 104
Projektowanie klas podstawowych spodziewających się implementacji
w klasie pochodnej 106
Dziedziczenie wymaga pamięci 108
Wielodziedziczenie po abstrakcyjnych klasach podstawowych nie powoduje
niejednoznaczności 109
Konstruktory 113
Inicjalizowanie zmiennych składowych 114
Argumenty domyślne pozwalająna zmniejszenie liczby konstruktorów 115
Tworzenie prywatnych konstruktorów 116
Tworzenie konstruktora kopiowania podczas przydzielania pamięci 118
Dbanie o kopiowanie przydzielonej pamięci w wypadku utworzenia
konstruktora kopiowania 120
Utworzenie wirtualnych destruktorów w wypadku spodziewanego
dziedziczenia 122
Jawne określanie używanego konstruktora w wypadku utworzenia kilku
konstruktorów 124
Dziedziczenie 127
Być kontra mieć 128
Zasady dotyczące zasięgu 129
Wielodziedziczenie może powodować niejednoznaczność 132
wskazówki
10 Przeciążanie operatorów 135
Różnica między operatorami przedrostkowymi a przyrostkowymi 136
Ostrożność przy przeciążaniu operatorów 136
Zachowywanie znaczenia operatorów 137
Przeciążanie operatora = w wypadku spodziewanych przypisań w klasie 137
Operatory mogą wykonywać więcej działań niż to się wydaje 139
Nietworzenie odwołań do zmiennych lokalnych 141
11 Szablony 143
Przechowywanie implementacji szablonu w innej klasie 144
12 Różne 147
Wstawianie zasobów graficznych 148
Sprawdzanie poprawności ścieżek 148
Nieumieszczanie na stosie obiektów ze zlic2aniem odwołań 149
Przekazywanie wstępnie przydzielonej pamięci do operatora new 150
Nakładanie się odwołań 152
13 Wydajność 155
Projekt jest ważniejszy od późniejszego dopracowywania kodu 156
Ustalanie, co trzeba poprawić 157
Oprzyrządowanie kodu 157
Zmniejszanie zbiom roboczego 158
Opcja minimalizowania rozmiaru 15?
Opóźnianie wczytywania 15$
Inwestowanie w dobre narzędzia 15C
Stosowanie szablonów znacznie powiększa kod 15^
W procesorze Pentium obliczenia zmiennopozycyjne są szybsze
niż obliczenia całko wito liczb o we 16(
Tabele wartości mogą zwiększyć wydajność 16<
Ostrożność przy używaniu funkcji bezpośrednich 16!
Sprawdzanie wygenerowanego kodu 16!
Przesunięcie bitowe jest szybsze niż dzielenie 16'
Obliczenia z użyciem wskaźników nie są szybsze niż przeglądanie tablic 16:
Przydzielanie pamięci jest kosztowne 16'
Ostrożność przy używaniu funkcji działających na napisach 16'
Unikanie biblioteki CRT 16
Funkcje wbudowane są szybsze niż funkcje CRT 16
14 Język maszynowy 17
Uzyskiwanie dostępu do zmiennych C++ z poziomu języka maszynowego 17
Kod w języku maszynowym działa tylko dla konkretnego procesora 17
Nieużywanie polecenia return w wypadku ustawienia rejestru EAX 17
Wyłączanie ostrzeżenia 4035 w wypadku ręcznego ustawiania rejestru EAX ... 17
Ponowne włączanie wyłączonych ostrzeżeń 17
15 Ogólne zagadnienia związane z usuwaniem błędów 177
Co to jest błąd? 178
Usuwanie usterek z projektu jeszcze przed rozpoczęciem kodowania 178
Sprawdzanie krok po kroku każdego nowego fragmentu kodu 179
Testowanie, gdy to możliwe, budowanie, gdy to konieczne 179
Testowanie danych, a nie kodu 1 SO
Sprawdzanie wygenerowanego kodu 1 SO
Planowanie testowania 1 SO
Testowanie wczesne i częste 181
Testowanie w niesprzyjających warunkach 181
Testowanie w skrajnych warunkach 181
Testowanie z punktu widzenia użytkownika 182
Testowanie z innymi aplikacjami 182
Testowanie na wszystkich platformach docelowych 182
Testowanie wersji ostatecznej i próbnej 183
16 Techniki usuwania usterek 185
Wczytywanie bibliotek DLL podczas usuwania usterek kodu 186
Wczytywanie plików wykonywalnych podczas usuwania usterek kodu 186
Rzutowanie danych 187
Zrzucanie rejestrów i ich znaczenie 187
Włączanie wyświetlania liczb szesnastkowych 188
Obsługiwanie wyjątków instrukcji 188
Zatrzymywanie w wypadku zmiany danych 189
Przeskakiwanie do wskazanej instrukcji 189
Tworzenie i stosowanie pliku odwzorowania pamięci 190
Analizowanie stosu wywołań 191
Zatrzymywanie stosu wywołań, gdy nie widać wszystkiego 194
II Przykładowe kody 197
17 Inteligentne wskaźniki 199
18 Zliczanie odwołań 20S
19 Tablice dynamiczne 211
20 Napisy 223
21 Działania na bitach 233
22 Sortowanie 243
23 Wyszukiwanie wyrażeń regularnych 249
Dodatek 261
O CD-ROM-ie 262
Skorowidz 263