Do opanowania języków C++11 i C++14 nie wystarcza zapoznanie się z wprowadzonymi w nich funkcjonalnościami (np. deklaracjami typu auto, semantyką operacji przenoszenia, wyrażeniami lambda i obsługą współbieżności).
Sztuką jest nauczenie się korzystania z tych funkcjonalności skutecznie – tak, aby programy były poprawne, wydajne, łatwe w utrzymaniu i przenośne. Pomocna w tym będzie niniejsza książka, w której został opisany sposób tworzenia wspaniałego oprogramowania przy użyciu standardów C++11 i C++14 – tj. nowoczesnego języka C++.
Tematy: • Zalety i wady inicjalizacji klamrowej, specyfikacji noexcept, technik doskonałego przekazywania argumentów oraz funkcji make służących do tworzenia wskaźników inteligentnych • Związki między std::move, std::forward, odwołaniami do r-wartości i odwołaniami uniwersalnymi • Techniki pisania czytelnych, poprawnych i skutecznych wyrażeń lambda • Różnice między std::atomic a volatile, zalecane sposoby użycia każdej z tych deklaracji oraz ich związek z interfejsem API współbieżności w języku C++ • Zmiany najlepszych rozwiązań znanych ze „starego” języka C++ (tj. C++98) wymagane podczas tworzenia oprogramowania w nowoczesnym języku C++
Książka Skuteczny nowoczesny C++ jest napisana zgodnie z wypróbowanym, opartym na wskazówkach i przykładach stylem wcześniejszych książek Scotta Meyersa, ale dotyczy całkowicie nowego materiału. Jest ważną pozycją dla każdego nowoczesnego twórcy oprogramowania w języku C++.
Przed ponad 20 laty książki Scotta Meyersa z serii Effective C++ (Effective C++, More Effective C++ i Effective STL) wyznaczyły poziom odniesienia dla wskazówek dotyczących programowania w języku C++. Jego jasne, ujmujące wyjaśnienia skomplikowanego materiału technicznego przyniosły mu światową sławę, dzięki której stał się popularnym trenerem, konsultantem i prezenterem konferencyjnym. Scott Meyers zyskał tytuł doktora informatyki na uniwersytecie Brown.
„Kiedy już zapoznałem się z podstawami języka C++, sposobów programowania kodu produkcyjnego w tym języku nauczyłem się z serii książek Meyersa Effective C++. Książka Skuteczny nowoczesny C++ jest najważniejszym podręcznikiem dotyczącym istotnych wytycznych, stylów i idiomów przydatnych do skutecznego i dobrego stosowania nowoczesnego języka C++. Nie masz jej jeszcze? Kup ją. Teraz.” Herb Sutter Przewodniczący komitetu standaryzacyjnego ISO C++ oraz architekt oprogramowania C++ w firmie Microsoft
Spis treści:
1. Dedukcja typów 9 Punkt 1: Dedukcja typów w szablonach 9 Punkt 2: Dedukcja typu auto 20 Punkt 3: decltype 26 Punkt 4: Jak wyświetlać wydedukowane typy 34
2. auto 41 Punkt 5: Preferuj deklarację auto zamiast jawnych deklaracji typów 41 Punkt 6: Stosuj idiom jawnego inicjatora typu, gdy deklaracja auto powoduje dedukcję niepożądanych typów 48
3. Droga do nowoczesnego języka C++ 55 Punkt 7: Rozróżniaj między () a {} podczas tworzenia obiektów 55 Punkt 8: Preferuj nullptr zamiast 0 i NULL 67 Punkt 9: Preferuj deklaracje aliasów zamiast typedef 72 Punkt 10: Preferuj wyliczenia enum z zasięgiem zamiast bez zasięgu 77 Punkt 11: Preferuj funkcje usunięte zamiast prywatnych niezdefiniowanych 85 Punkt 12: Deklaruj funkcje nadpisujące jako override 91 Punkt 13: Preferuj iteratory const_iterator zamiast iterator 99 Punkt 14: Deklaruj funkcje jako noexcept, jeśli nie zgłaszają wyjątków 104 Punkt 15: Stosuj constexpr, kiedy to tylko możliwe 112 Punkt 16: Dbaj o bezpieczeństwo wątkowe funkcji składowych const 120 Punkt 17: Generowanie specjalnych funkcji składowych 127
4. Wskaźniki inteligentne 137 Punkt 18: Stosuj wskaźniki std::unique_ptr do zarządzania Punkt 19: Stosuj wskaźniki std::shared_ptr w przypadku zarządzania zasobami o współdzielonym posiadaniu 146 Punkt 20: Stosuj typ std::weak_ptr dla wskaźników przypominających std::shared_ptr, które mogą zawisnąć 157 Punkt 21: Preferuj funkcje std::make_unique i std::make_shared zamiast bezpośredniego używania instrukcji new 163 Punkt 22: Podczas używania idiomu Pimpl definiuj specjalne funkcje składowe w pliku implementacji 173
5. Odwołania do r‑wartości, semantyka przenoszenia i przekazywanie doskonałe 185 Punkt 23: std::move i std::forward 186 Punkt 24: Odróżniaj odwołania uniwersalne od odwołań do r‑wartości 193 Punkt 25: Stosuj std::move w przypadku odwołań do r‑wartości, a std::forward w przypadku odwołań uniwersalnych 199 Punkt 26: Unikaj przeciążania w przypadku odwołań uniwersalnych 209 Punkt 27: Zapoznaj się z alternatywami przeciążania odwołań uniwersalnych 217 Punkt 28: Zwijanie odwołań 233 Punkt 29: Załóż, że operacje przenoszenia nie są ani obecne, ani tanie, ani używane 241 Punkt 30: Zapoznaj się z przypadkami niepowodzeń przenoszenia doskonałego 245
6. Wyrażenia lambda 257 Punkt 31: Unikaj domyślnych trybów przechwytywania 259 Punkt 32: Stosuj przechwytywanie inicjujące do przenoszenia obiektów do domknięć 268 Punkt 33: Stosuj decltype do parametrów auto&&, aby je przekazywać za pomocą std::forward 275 Punkt 34: Preferuj wyrażenia lambda zamiast std::bind 278
7. Interfejs API współbieżności Punkt 35: Preferuj programowanie oparte na zadaniach zamiast opartego na wątkach 289 Punkt 36: Określ zasadę std::launch::async, jeśli asynchoniczność jest istotna 294 Punkt 37: Doprowadź wątki std::thread do stanu nieprzyłączalnego na wszystkich ścieżkach 300 Punkt 38: Uważaj na różnorodne działanie destruktorów uchwytów wątków 309 Punkt 39: Rozważ obiekty future typu void do komunikacji zdarzeń jednorazowych 314 Punkt 40: Stosuj std::atomic dla współbieżności, a volatile dla pamięci specjalnej 325
8. Szlify 335 Punkt 41: Rozważ przekazywanie przez wartość parametrów, które można kopiować i tanio przenosić – o ile są zawsze kopiowane 335 Punkt 42: Rozważ umieszczanie zamiast wstawiania 348 Najniższa cena z 30 dni przed obniżką 63,84zł
Skuteczny nowoczesny C++ 42 sposoby lepszego posługiwania się językami C++11 i C++14
|