Wyjatkowy jezyk C 40 nowych lamiglowek zadan programistycznych i rozwiazan.pdf

(448 KB) Pobierz
IDZ DO
PRZYK£ADOW Y ROZDZIA£
Wyj¹tkowy jêzyk C++.
40 nowych ³amig³ówek, zadañ
programistycznych i rozwi¹zañ
SPIS TRECI
KATALOG KSI¥¯EK
Autor: Herb Sutter
T³umaczenie: Marcin Miklas
ISBN: 83-7361-712-4
Tytu³ orygina³ u: More Exceptional C++
Format: B5, stron: 280
KATALOG ONLINE
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
Poznaj skuteczne rozwi¹zania problemów,
jakie napotkasz podczas codziennej pracy programisty
• Prawid³owo zoptymalizuj kod ród³owy
• Zaprojektuj efektywn¹ obs³ugê wyj¹tków
• Naucz siê odpowiednio korzystaæ z przestrzeni nazw
Nauka ka¿dego nowego zagadnienia przebiega zdecydowanie szybciej i efektywniej pod
kierunkiem osoby znaj¹cej temat. Nie inaczej jest w przypadku nauki programowania
w jêzyku C++. Programowanie w tym jêzyku wymaga dog³êbnego opanowania
mo¿liwoci biblioteki standardowej, in¿ynierii oprogramowania i wielu innych tematów.
Rozwi¹zuj¹c samodzielnie zagadki, jakie czêsto pojawiaj¹ siê podczas poznawania
jêzyka C++ lepiej zapamiêtujemy ich rozwi¹zania, dziêki czemu ³atwiej mo¿emy
zastosowaæ je w codziennej pracy.
Ksi¹¿ka „Wyj¹tkowy jêzyk C++. 40 nowych ³amig³ówek, zadañ programistycznych
i rozwi¹zañ” to zbiór zagadnieñ zwi¹zanych z niemal wszystkimi aspektami
programowania w C++, przedstawionych w formie zagadek z rozwi¹zaniami.
Opisuje zarówno podstawy stosowania szablonów, biblioteki standardowej
i projektowanie klas, jak i tematy zaawansowane -- przestrzenie nazw, wyj¹tki,
dziedziczenie i zarz¹dzanie zasobami. Czytaj¹c j¹, przekonasz siê, w jaki sposób
mo¿na u¿yæ pozornie niezwi¹zanych ze sob¹ elementów do opracowania nowych
i oryginalnych rozwi¹zañ czêstych problemów.
• Poprawne stosowanie predykatów
• Kontenery i wskaniki
• Korzystanie z szablonów
• Optymalizacja kodu
• Bezpieczna obs³uga wyj¹tków
• Mechanizmy dziedziczenia i polimorfizmu
• Zarz¹dzanie zasobami i pamiêci¹
• Makrodefinicje
• Przestrzenie nazw
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMÓW INFORMACJE
O NOWOCIACH
ZAMÓW CENNIK
CZYTELNIA
FRAGMENTY KSI¥¯EK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
945029553.023.png 945029553.024.png 945029553.025.png 945029553.026.png 945029553.001.png 945029553.002.png 945029553.003.png 945029553.004.png 945029553.005.png 945029553.006.png 945029553.007.png 945029553.008.png 945029553.009.png 945029553.010.png 945029553.011.png 945029553.012.png 945029553.013.png 945029553.014.png
 
Spis treści
Słowo wstępne .................................................................................. 7
Przedmowa........................................................................................ 9
Rozdział 1. Programowanie uogólnione i biblioteka standardowa języka C++ ....... 13
Zagadnienie 1. Przełączanie strumieni ............................................................................ 14
Zagadnienie 2. Predykaty. Część 1 — co usuwa funkcja remove()? ............................... 18
Zagadnienie 3. Predykaty. Część 2 — pamięć stanu ....................................................... 22
Zagadnienie 4. Szablony rozszerzalne — dziedziczenie czy cechy charakterystyczne? . 29
Zagadnienie 5. Słowo kluczowe typename...................................................................... 42
Zagadnienie 6. Kontenery, wskaźniki i kontenery, które nie są kontenerami.................. 46
Zagadnienie 7. Stosowanie kontenerów vector i deque ................................................... 55
Zagadnienie 8. Stosowanie kontenerów set i map ........................................................... 62
Zagadnienie 9. Równoważny kod?.................................................................................. 67
Zagadnienie 10. Specjalizacja i przeciążanie szablonów................................................. 72
Zagadnienie 11. Gra Mastermind .................................................................................... 77
Rozdział 2. Optymalizacja a efektywność........................................................... 89
Zagadnienie 12. Słowo kluczowe inline .......................................................................... 89
Zagadnienie 13. Opieszała optymalizacja. Część 1 — klasa String ................................ 93
Zagadnienie 14. Opieszała optymalizacja. Część 2 — wprowadzamy opieszałość......... 96
Zagadnienie 15. Opieszała optymalizacja. Część 3 — iteratory i referencje ................. 100
Zagadnienie 16. Opieszała optymalizacja. Część 4 — środowiska wielowątkowe ....... 108
Rozdział 3. Zagadnienia i techniki związane z bezpieczną obsługą wyjątków ..... 121
Zagadnienie 17. Błędy konstruktora. Część 1 — czas życia obiektu............................. 121
Zagadnienie 18. Błędy konstruktora. Część 2 — wchłanianie ...................................... 125
Zagadnienie 19. Wyjątki nieprzechwycone................................................................... 132
Zagadnienie 20. Problem niezarządzanego wskaźnika.
Część 1 — obliczanie parametrów.............................................................................. 137
Zagadnienie 21. Problem niezarządzanego wskaźnika.
Część 2 — co z szablonem auto_ptr?..................................................................... 140
6
Spis treści
Zagadnienie 22. Projektowanie klas zapewniających bezpieczną obsługę wyjątków.
Część 1 — operator przypisania ................................................................................. 146
Zagadnienie 23. Projektowanie klas zapewniających bezpieczną obsługę wyjątków.
Część 2 — dziedziczenie ............................................................................................ 154
Rozdział 4. Dziedziczenie i polimorfizm ............................................................. 159
Zagadnienie 24. Dlaczego dziedziczenie wielobazowe? ............................................... 159
Zagadnienie 25. Emulowanie dziedziczenia wielobazowego ........................................ 163
Zagadnienie 26. Dziedziczenie wielobazowe i problem bliźniąt syjamskich ................ 166
Zagadnienie 27. Metody (nie)czysto wirtualne ............................................................. 170
Zagadnienie 28. Polimorfizm kontrolowany ................................................................. 175
Rozdział 5. Zarządzanie zasobami i pamięcią.................................................... 179
Zagadnienie 29. Stosowanie szablonu auto_ptr............................................................. 179
Zagadnienie 30. Inteligentne wskaźniki jako składowe.
Część 1 — problem z auto_ptr ................................................................................... 186
Zagadnienie 31. Inteligentne wskaźniki jako składowe.
Część 2 — kurs na ValuePtr ....................................................................................... 191
Rozdział 6. Funkcje swobodne i makrodefinicje ................................................ 203
Zagadnienie 32. Rekurencyjne deklaracje ..................................................................... 203
Zagadnienie 33. Imitowanie funkcji zagnieżdżonych.................................................... 208
Zagadnienie 34. Dyrektywy preprocesora ..................................................................... 216
Zagadnienie 35. Makrodefinicje.................................................................................... 219
Rozdział 7. Zagadnienia różne ......................................................................... 225
Zagadnienie 36. Inicjalizacja......................................................................................... 225
Zagadnienie 37. Deklaracje zapowiadające................................................................... 228
Zagadnienie 38. Instrukcja typedef ............................................................................... 229
Zagadnienie 39. Przestrzenie nazw. Część 1 — deklaracje i dyrektywy using ............. 232
Zagadnienie 40. Przestrzenie nazw. Część 2 — migracja do przestrzeni nazw............. 235
Posłowie ....................................................................................... 245
Dodatek A Optymalizacje, które nie są optymalizacjami .................................... 247
Dodatek B Wyniki testów ............................................................................... 263
Bibliografia .................................................................................... 271
Skorowidz ..................................................................................... 273
Rozdział 4.
Dziedziczenie
i polimorfizm
Czym jest programowanie obiektowe bez odrobiny dziedziczenia i polimorfizmu?
Dziedziczenie, chociaż często nadużywane, jest nadal ważnym narzędziem — i dotyczy
to także dziedziczenia wielobazowego. Dziedziczenie wielobazowe jest szczególnie
przydatne, gdy zachodzi potrzeba połączenia bibliotek różnych producentów. Przy takim
łączeniu daje się we znaki problem tzw. bliźniąt syjamskich — pokażemy tu, jak go
uniknąć. Zaprezentujemy także wiele uprawnionych (i kilka nieuprawnionych) zasto-
sowań funkcji wirtualnych, kodowanie rozwiązań alternatywnych wobec dziedziczenia
wielobazowego i kontrolowanie możliwości używania związków dziedziczenia.
Zagadnienie 24. Dlaczego dziedziczenie wielobazowe?
Zagadnienie 24. Dlaczego dziedziczenie wielobazowe?
Stopień trudności: 6
Niektóre języki, łącznie ze standardem języka SQL99, zmagają się z pytaniem, czy obsługiwać
dziedziczenie wyłącznie pojedyncze czy również wielobazowe. Zagadnienie to zachęca
do rozpatrzenia tych kwestii.
1. Co to jest dziedziczenie wielobazowe i jakie dodatkowe możliwości lub komplikacje
wprowadza włączenie takiego dziedziczenia do języka C++?
2. Czy dziedziczenie wielobazowe jest kiedykolwiek konieczne? Jeśli tak, pokaż jak
najwięcej przykładowych sytuacji i uzasadnij, dlaczego język powinien obsługiwać
dziedziczenie wielobazowe. Jeśli nie, uzasadnij dlaczego dziedziczenie pojedyncze (DP),
być może połączone z interfejsami w stylu języka Java, dorównuje lub przewyższa
wielobazowe i dlaczego język nie powinien zawierać takiego dziedziczenia.
Rozwiązanie
1. Co to jest dziedziczenie wielobazowe i jakie dodatkowe możliwości
lub komplikacje wprowadza włączenie takiego dziedziczenia do języka C++?
945029553.015.png 945029553.016.png 945029553.017.png 945029553.018.png 945029553.019.png 945029553.020.png
 
160
Rozdział 4. Dziedziczenie i polimorfizm
W skrócie, dziedziczenie wielobazowe oznacza możliwość dziedziczenia po więcej
niż jednej bezpośredniej klasie bazowej.
Na przykład:
class Derived : public Base1, private Base2
{
//…
};
Dopuszczenie dziedziczenia wielobazowego wprowadza możliwość, że klasa może
mieć tę samą (bezpośrednią lub pośrednią) klasę bazową występującą jako przodek
więcej niż jeden raz. Prosty przykład to klasyczny rombokształtny diagram dziedzi-
czenia pokazany na rysunku 4.
Rysunek 4.
Zgubny romb
(jeśli dziedziczenie
po klasie B
jest wirtualne)
Tutaj klasa B jest pośrednią klasą bazową klasy D dwukrotnie, raz przez klasę C1 , drugi
raz przez klasę C2 .
Sytuacja ta wprowadza potrzebę dodatkowej własności języka C++ — dziedziczenia
wirtualnego. Pytanie brzmi: Czy programista chce, aby klasa D posiadała jeden podo-
biekt bazowy typu B czy dwa? Jeśli jeden, to wtedy klasa B powinna być wirtualną
klasą bazową i rysunek 4. staje się rombem zgubnym. Jeśli dwa, to klasa B powinna być
normalną (niewirtualną) klasą bazową.
Wreszcie, główną komplikacją wirtualnych klas bazowych jest to, że muszą być ini-
cjalizowane bezpośrednio przez najdalej dziedziczącą klasę. Więcej informacji o tym
i innych aspektach dziedziczenia wielobazowego znajdziesz w książkach [Stroustrup00]
oraz w Zagadnieniu 43. w książce [Meyers97].
Unikaj wielobazowego dziedziczenia po więcej niż jednej nieprotokołowej klasie
(klasa protokołowa to abstrakcyjna klasa bazowa niezawierająca danych
i składającą się jedynie z czysto wirtualnych metod).
2. Czy dziedziczenie wielobazowe jest kiedykolwiek konieczne?
Krótka odpowiedź: żadna własność języka nie jest „bezwzględnie konieczna”, albo-
wiem każdy program można napisać w asemblerze. Jednakże tak jak większość ludzi
wolałaby nie kodować swojego własnego mechanizmu funkcji wirtualnych w zwykłym
945029553.021.png 945029553.022.png
Zgłoś jeśli naruszono regulamin