You are on page 1of 7

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

C++. Kanony wiedzy


programistycznej
Autor: Stephen C. Dewhurst
Tumaczenie: Przemysaw Szeremiota
ISBN: 83-246-0024-8
Tytu oryginau: C++ Common Knowledge:
Essential Intermediate Programming
Format: B5, stron: 248
Wiadomoci niezbdne kademu programicie
Zasady programowania obiektowego
Stosowanie wzorcw projektowych
Korzystanie z mechanizmu szablonw
C++ jest jednym z najpopularniejszych jzykw programowania. Jego potne
moliwoci id w parze ze zoonoci, ktra powoduje, e nauka programowania
w C++ nie jest atwym zadaniem. Programista, ktry chce opanowa zasady tworzenia
aplikacji w C++, musi w peni opanowa przynajmniej cz zwizanych z tym jzykiem
poj i technik. Napisanie prawidowo i wydajnie dziaajcego programu wymaga
wykorzystania tej wiedzy w praktyce.
C++. Kanony wiedzy programistycznej to przegld zagadnie, ktrych znajomo
jest nieodzowna dla kadego programisty korzystajcego z C++. Czytajc t ksik,
poznasz reguy projektowania i programowania obiektowego, sposoby wykorzystywania
funkcji i szablonw oraz zasady stosowania wzorw projektowych. Przeczytasz
o dyrektywach kompilatora, wskanikach i rzutowaniu. Dowiesz si wszystkiego,
co jest uwaane za sedno jzyka C++.
Projektowanie obiektowe
Polimorfizm
Wykorzystywanie podstawowych wzorcw projektowych
Deklarowanie funkcji i tablic
Zarzdzanie pamici
Sterowanie przebiegiem kompilacji
Korzystanie z szablonw
Obsuga bdw za pomoc wyjtkw

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Ta ksika pozwoli Ci si sta programist doskonaym


O autorze:
Stephen C. Dewhurst by jednym z pierwszych uytkownikw jzyka C++
w laboratoriach Bell Labs. Ma ponad dwudziestoletnie dowiadczenie w stosowaniu
C++ do rozwizywania problemw w takich dziedzinach, jak projektowanie kompilatorw,
zabezpieczanie handlu elektronicznego czy telekomunikacja implementowana na bazie
urzdze wbudowanych. Jest autorem ksiki C++ Gotchas (Addison-Wesley, 2003)
i wspautorem ksiki Programming in C++, Second Edition (Prentice Hall, 1995).
Dewhurst jest czonkiem grupy doradczej przy The C++ Source i wspredaktorem
magazynu C/C++ Users Journal; wczeniej prowadzi swoj kolumn w C++ Report.
Jest rwnie twrc dwch kompilatorw jzyka C++ i wielu artykuw traktujcych
o projektowaniu kompilatorw i technikach programowania w C++.

Spis treci
Podzikowania ........................................................................... 7
Wstp ....................................................................................... 9
Konwencje typograficzne .......................................................... 15
Zagadnienie 1. Abstrakcje ............................................................................... 17
Zagadnienie 2. Polimorfizm .............................................................................. 19
Zagadnienie 3. Wzorce projektowe .................................................................. 23
Zagadnienie 4. Standardowa biblioteka szablonw ........................................... 27
Zagadnienie 5. Referencje s aliasami, nie wskanikami .................................. 29
Zagadnienie 6. Parametry tablicowe ................................................................ 33
Zagadnienie 7. Wskaniki const i wskaniki na const ....................................... 37
Zagadnienie 8. Wskaniki na wskaniki ........................................................... 41
Zagadnienie 9. Nowe operatory rzutowania ...................................................... 43
Zagadnienie 10. Semantyka metod deklarowanych z const ................................. 47
Zagadnienie 11. Kompilator nadziewa klasy farszem ........................................... 51
Zagadnienie 12. Przypisanie to nie to samo co inicjalizacja ................................ 55
Zagadnienie 13. Operacje kopiowania ................................................................ 59
Zagadnienie 14. Wskaniki funkcji ..................................................................... 63
Zagadnienie 15. Wskaniki skadowych klas nie s wskanikami ........................ 67
Zagadnienie 16. Wskaniki metod nie s wskanikami ....................................... 71
Zagadnienie 17. Deklaratory funkcji i tablic ....................................................... 75
Zagadnienie 18. Obiekty funkcyjne .................................................................... 77
Zagadnienie 19. Wzorzec Command i dewiza hollywoodzka ................................. 81
Zagadnienie 20. Obiekty funkcyjne STL .............................................................. 85

Spis treci

Zagadnienie 21. Przecianie to nie to samo co przesanianie ............................ 89


Zagadnienie 22. Wzorzec Template Method ......................................................... 91
Zagadnienie 23. Przestrzenie nazw .................................................................... 93
Zagadnienie 24. Wyszukiwanie metod ................................................................ 97
Zagadnienie 25. Wyszukiwanie ADL ................................................................... 99
Zagadnienie 26. Wyszukiwanie funkcji operatorw ........................................... 101
Zagadnienie 27. Odpytywanie klasy ................................................................. 103
Zagadnienie 28. Semantyka porwnywania wskanikw ................................... 107
Zagadnienie 29. Konstruktory wirtualne i wzorzec Prototype ............................ 109
Zagadnienie 30. Wzorzec Factory Method ........................................................ 113
Zagadnienie 31. Kowariancja typw zwracanych .............................................. 117
Zagadnienie 32. Blokowanie kopiowania .......................................................... 121
Zagadnienie 33. Wytwarzanie abstrakcyjnych klas bazowych ............................ 123
Zagadnienie 34. Blokowanie przydziau na stercie ............................................ 125
Zagadnienie 35. Miejscowa wersja new ........................................................... 127
Zagadnienie 36. Zarzdzanie pamici w klasie ............................................... 131
Zagadnienie 37. Przydzia tablicowy ................................................................. 135
Zagadnienie 38. Aksjomaty odpornoci na wyjtki ........................................... 139
Zagadnienie 39. Funkcje odporne na wyjtki .................................................... 143
Zagadnienie 40. Regua RAII ........................................................................... 147
Zagadnienie 41. Operator new, konstruktory i wyjtki ...................................... 151
Zagadnienie 42. Inteligentne wskaniki ........................................................... 153
Zagadnienie 43. Niezwykoci auto_ptr ............................................................ 155
Zagadnienie 44. Arytmetyka wskanikw ......................................................... 157
Zagadnienie 45. Terminologia szablonw ......................................................... 161
Zagadnienie 46. Jawna specjalizacja szablonu klasy ......................................... 163
Zagadnienie 47. Czciowa specjalizacja szablonu ........................................... 167
Zagadnienie 48. Specjalizacja metody szablonu klasy ....................................... 171
Zagadnienie 49. Niepewno co do nazw typw ............................................... 175
Zagadnienie 50. Szablony skadowych ............................................................. 179
Zagadnienie 51. Niepewno co do nazw szablonw ......................................... 183
Zagadnienie 52. Specjalizacja dla informacji o typie ......................................... 185

Spis treci

Zagadnienie 53. Osadzanie informacji o typie ................................................... 189


Zagadnienie 54. Klasy cech ............................................................................. 193
Zagadnienie 55. Szablony parametrw szablonu ............................................... 199
Zagadnienie 56. Klasy wytycznych ................................................................... 205
Zagadnienie 57. Dedukcja argumentw szablonu .............................................. 209
Zagadnienie 58. Przecianie szablonw funkcji ............................................... 213
Zagadnienie 59. Regua SFINAE ...................................................................... 217
Zagadnienie 60. Algorytmy uoglnione ............................................................. 221
Zagadnienie 61. Konkretyzuje si tylko to, co uywane .................................... 225
Zagadnienie 62. Bariery #include ..................................................................... 229
Zagadnienie 63. Opcjonalne sowa kluczowe .................................................... 231
Bibliografia ............................................................................ 235
Skorowidz .............................................................................. 237

Zagadnienie 7.

Wskaniki const
i wskaniki na const
W swobodnych konwersacjach programici C++ czsto mwic wskanik const
maj tak naprawd na myli wskanik na const. Szkoda, bo to dwa rne pojcia.
T *pt = new T;
const T *pct = pt;
T *const cpt = pt;

// wskanik na T
// wskanik na const T
// wskanik const na T

Zanim zaczniemy gorczkowo tasowa const w deklaracjach wskanikw, powinnimy najpierw zdecydowa, o co nam chodzi. Co ma by stae: wskanik, obiekt
wskazywany, czy moe oba? W deklaracji pct wskanik nie jest stay, stay (niemodyfikowalny) ma by za to obiekt przeze wskazywany; kwalifikator const modyfikuje
typ bazowy T, a nie modyfikator wskanika *. W przypadku cpt deklarowany jest
niemodyfikowalny (stay) wskanik obiektu modyfikowalnego; kwalifikator const
modyfikuje tu modyfikator wskanika *, zostawiajc w spokoju typ bazowy T.
Aby jeszcze zaciemni skadni wskanikw i kwalifikatora const, mona powiedzie,
e kolejno specyfikatorw deklaracji, czyli kolejno tego, co wystpuje w deklaracji wskanika przed pierwszym modyfikatorem *, jest nieistotna. Na przykad, obie
ponisze deklaracje wprowadzaj do programu zmienne dokadnie tego samego typu:
const T *p1;
T const *p2;

// wskanik na const T
// rwnie wskanik na const T

Pierwsza posta jest bardziej klasyczna, ale wielu ekspertw C++ zaleca teraz stosowanie postaci drugiej. W uzasadnieniu podnosz, e owa posta zmniejsza ryzyko
nieporozumie, bo mona sobie pomc odczytaniem deklaracji od tyu: wskanik na
const T. Wybr jednej z powyszych form jest dowolny, wane, aby trzyma si raz
przyjtej konwencji. Sowem, naley uwaa na czsty bd mylenia deklaracji wskanika staego z deklaracj wskanika na obiekt stay (niemodyfikowalny).
T const * p3;
T *const p4 = pt;

// wskanik na obiekt stay


// stay wskanik na obiekt modyfikowalny

22

Zagadnienie 7. Wskaniki const i wskaniki na const

Moliwe jest oczywicie zadeklarowanie rwnie staego (const) wskanika na obiekt


stay (const):
const T * const cpct1 = pt;
// wszystko const
T const * const cpct2 - cpct1; // identyczny typ

Zauwamy, e czsto zamiast wskanika const, prociej zastosowa referencj:


const T &rct = *pt;
T &rt = *pt;

// zamiast const T * const


// zamiast T *const

W niektrych z powyszych przykadw mielimy moliwo konwersji wskanika


bez const (modyfikowalnego) na wskanik const (niemodyfikowalny). Moemy na
przykad zainicjalizowa pct (typu const T *) wartoci pt (typu T *). Jest to dozwolone, poniewa mwic potocznie nie grozi to niczym zym. Sprawdmy,
co stanie si w wyniku skopiowania adresu obiektu modyfikowalnego do wskanika
na obiekt niemodyfikowalny (rysunek 7.1).
Rysunek 7.1.
Wskanik na const
moe wskazywa
obiekt
modyfikowalny
(bez const)

Wskanik pct (wskanik na const) wskazuje obiekt typu T niebdcy staym (bez
const), ale nie wprowadza to adnej sprzecznoci. W rzeczy samej, sytuacja odwoywania si do obiektw modyfikowalnych za porednictwem wskanikw na const jest
do czsta:
void aFunc( const T *arg1, const T &arg2 );
//
T *a = new T;
T b;
aFunc( a, b );

Przy wywoaniu aFunc nastpuje inicjalizacja arg1 adresem a i arg2 adresem b. Nie
sposb jednak powiedzie, czy a faktycznie wskazuje obiekt niemodyfikowalny, albo
czy b jest const; zakadamy jedynie, e tak bd traktowane w obrbie funkcji aFunc.
To bardzo uyteczne.
Konwersja odwrotna, czyli ze wskanika na obiekt niemodyfikowalny do postaci
wskanika na obiekt modyfikowalny nie jest dozwolona, bo byaby niebezpieczna
(patrz rysunek 7.2).
Rysunek 7.2.
Wskanik na obiekt
bez const nie moe
odnosi si do
obiektu const

Zagadnienie 7. Wskaniki const i wskaniki na const

23

W takim ukadzie pct moe faktycznie wskazywa obiekt niemodyfikowalny, zdefiniowany z kwalifikatorem const. Gdybymy ten wskanik chcieli skonwertowa do
postaci wskanika na obiekt modyfikowalny, umoliwilibymy potencjalnie zmian
wartoci acT za porednictwem pt:
const T acT;
pct = &act;
pt = pct;
// bd, na szczcie
*pt = aT;
// prba zmiany obiektu const!

Standard C++ mwi, e takie przypisanie bdzie dawao niezdefiniowane rezultaty;


nie wiadomo wic dokadnie, co si stanie, ale zapewne nic dobrego. Oczywicie moemy wykona konwersj uciekajc si do jawnego rzutowania:
pt = const_cast<T *>(pct);
*pt = aT;

// odradzane, cho to nie bd


// prba zmiany obiektu const!

Jednak jeli pt bdzie odnosi si do obiektu, ktry (jak acT) zosta zadeklarowany
jako niemodyfikowalny (const), efekt przypisania wci bdzie niezdefiniowany (zobacz Nowe operatory rzutowania [9, 43]).

You might also like