C++ブックガイド&リストの決定版

この質問は、毎年出版される何十冊もの悪いC++本の中から、数少ない真珠を集めようとするものです。

他の多くのプログラミング言語とは異なり、C++はインターネット上のチュートリアルから学ぶことができますが、よくできたC++の本を読まずにC++をすぐに習得できる人はほとんどいません。そのためには、C++はあまりにも大きくて複雑なのです。実際、C++はあまりにも大きくて複雑なので、世の中には非常に多くのひどいC++の本があります。ここで言っているのは、スタイルが悪いということではなく、_明らかな事実誤認があったり、_とんでもなく悪いプログラミングスタイルを推奨していたりということです。

できれば、C++チャットルーム_であなたが追加した本について議論した後に、質の高い本とおおよそのスキルレベルを提供するために、受け入れられた回答を編集してください。(常連客は、推薦に同意しない場合、あなたの仕事を容赦なく取り消すかもしれません)あなたが個人的に読んだ/恩恵を受けた各書籍について、短い宣伝文句/説明文を加えてください。品質や見出しなどについて自由に議論してください。基準を満たした本はリストに追加されます。 Association of C and C++ Users (ACCU) によるレビューが掲載されている書籍には、そのレビューへのリンクがあります。

*注意:FAQなどはC++タグ情報や[tag:c++-faq]の下にあります。

Beginner

入門編、プログラミング経験なし

  • C++ Primer * (Stanley Lippman, Josée Lajoie, and Barbara E. Moo) (Updated for C++11) 1kページに及ぶこの本は、C++のほぼすべてを網羅し、非常にわかりやすい形式で詳細に説明している、非常に充実したC++の入門書です。第5版(2012年8月16日発売)ではC++11に対応しています。 [レビュー]
  • Programming: Principles and Practice Using C++ (Bjarne Stroustrup, 2nd Edition - May 25, 2014) (updated for C++11/C++14) C++言語の生みの親による、C++を使ったプログラミングの入門書です。プログラミングの経験がないことを前提としているが、初心者だけのものではない、良い読み物である。

入門編、プログラミング経験あり

  • A Tour of C++ (Bjarne Stroustrup) (C++17用第2版)この「ツアー」は、すでにC++を知っているか、少なくとも経験豊富なプログラマーである人を対象に、標準的なC++のすべて(言語と標準ライブラリ、およびC++11の使用)を中程度の高さのレベルで概観する、短時間(約180ページ、14章)のチュートリアルです。本書は、『The C++ Programming Language, 4th edition』の第2章から第5章を構成する資料の拡張版です。

  • Accelerated C++ (Andrew Koenig and Barbara Moo, 1st Edition - August 24, 2000) この本は基本的に C++ Primer と同じ内容をカバーしていますが、そのスペースは 4 分の 1 です。これは主に、この本が「プログラミング」の入門書ではなく、他の言語でプログラミングをしたことがある人のための「C++」の入門書であることに起因します。学習曲線は急ですが、これに対応できる人にとっては、非常にコンパクトな言語の入門書となります。(歴史的には、C++を教えるために現代的なアプローチを採用した最初の初心者向けの本として、新しい境地を開いたと言えるでしょう)。)にもかかわらず、この本が教えているC++ 教えるのは純粋にC++98です。[レビュー]

    ベストプラクティス

  • Effective C++_](http://www.amazon.com/dp/0321334876/) (Scott Meyers, 3rd Edition - May 22, 2005) C++プログラマが読むべき最高の2冊目の本になることを目指して書かれたもので、成功しています。以前の版では、C言語から来たプログラマを対象としていましたが、第3版ではこれを変更し、Javaなどの言語から来たプログラマを対象としています。この本では、覚えやすい50の経験則を、その根拠とともに、非常にわかりやすい(そして楽しい)スタイルで紹介しています。C++11とC++14については、例題といくつかの問題が古くなっているので、Effective Modern C++の方が良いでしょう。[レビュー]

  • Effective Modern C++]1 (Scott Meyers) これは基本的に Effective C++ の新バージョンで、C++03 から C++11 および C++14 に移行する C++ プログラマを対象としています。

  • Effective STL](http://www.amazon.com/dp/0201749629/) (Scott Meyers) これは、_Effective C++_が言語全体に対して行ったのと同じことを、STLから来る標準ライブラリの一部に対して行うことを目的としています。経験則とその根拠を示しています。[レビュー]

    中級

  • More Effective C++_](http://www.amazon.com/dp/020163371X/) (Scott Meyers) _Effective C++_よりもさらに多くの経験則があります。最初の本に載っていたものほど重要ではありませんが、知っておいて損はありません。

  • 例外 C++_](http://www.amazon.com/dp/0201615622/) (Herb Sutter) この本はパズルのように構成されていますが、pimpl イディオム、名前検索、優れたクラス設計、C++ メモリモデルなどのさまざまなトピックの詳細な説明に加えて、RAII (Resource Acquisition is Initialization) を通じて C++ における適切なリソース管理と例外処理の安全性について、最高かつ徹底的に議論しています。[レビュー]

  • More Exceptional C++_](http://www.amazon.com/dp/020170434X/) (Herb Sutter) C++ での効果的なオブジェクト指向プログラミングと STL の正しい使い方の議論に加えて、Exceptional C++ でカバーされていない例外安全性のトピックを追加でカバーしています。[レビュー]

  • Exceptional C++ Style (Herb Sutter) 一般的なプログラミング、最適化、リソース管理について説明しています。この本では、非メンバー関数と単一責任原則を使って C++ でモジュール式のコードを書く方法についても優れた説明がなされています。[レビュー]

  • C++ Coding Standards (Herb Sutter and Andrei Alexandrescu) ここでいう "Coding Standards" は "コードを何スペースインデントすべきか" という意味ではありません。 この本には、正しい、理解しやすい、効率的な C++ コードを書くために役立つ、101 のベストプラクティス、イディオム、および共通の落とし穴が含まれています。[レビュー]

  • C++ Templates: The Complete Guide (David Vandevoorde and Nicolai M. Josuttis) C++11 以前のテンプレートについての the book です。 非常に基本的なことから最先端のテンプレートメタプログラミングまでをカバーしており、テンプレートがどのように機能するか(概念的にも、どのように実装されるかについても)を詳細に説明し、多くの一般的な落とし穴について議論しています。 また、付録として One Definition Rule (ODR) と Overload Resolution (過負荷解決) についての優れた要約があります。C++11、C++14、C++17をカバーする「第2版」(http://amzn.com/0321714121)がすでに出版されています。[[レビュー]](http://accu.org/index.php?module=bookreviews&func=search&rid=506)

  • C++ 17 - The Complete Guide (Nicolai M. Josuttis) この本は C++17 標準で導入されたすべての新機能を説明しています。「インライン変数」や「constexpr if」のような簡単なものから、「多相性メモリリソース」や「オーバーアラインデータの新規作成と削除」に至るまで、すべてを網羅しています。

    高度な

  • Modern C++ Design (Andrei Alexandrescu) 高度な汎用プログラミング技術に関する画期的な本です。 ポリシーベースのデザイン、タイプリスト、基本的なジェネリックプログラミングのイディオムを紹介し、多くの有用なデザインパターン(スモールオブジェクトアローケータ、ファンクタ、ファクトリ、ビジター、マルチメソッドなど)がジェネリックプログラミングを使っていかに効率的、モジュール的、かつクリーンに実装できるかを説明しています。[レビュー]

  • COPYC++ Template Metaprogramming (David Abrahams and Aleksey Gurtovoy)

  • C++ Concurrency In Action (Anthony Williams) スレッドライブラリ、アトミックライブラリ、C++ メモリモデル、ロック、ミューテックスなど、C++11 の並行処理のサポートや、マルチスレッドアプリケーションの設計とデバッグの問題を扱った本です。C++14とC++17をカバーした「第2版」2もすでに出版されています。

  • Advanced C++ Metaprogramming (Davide Di Gennaro) C++11 以前の TMP 技術のマニュアルで、理論よりも実践に重点が置かれています。 この本には大量のスニペットがあり、中には型の特性によって陳腐化しているものもありますが、それでも知っておくと便利なテクニックが満載です。 奇妙なフォーマットや編集に耐えられるのであれば、Alexandrescuよりも読みやすく、間違いなくやりがいのある本だと思います。 経験豊富な開発者にとっては、通常は豊富な経験からしか得られないC++の暗部(クセ)について、何かを得られる可能性が高い。

    参照スタイル - 全レベル

  • The C++ Programming Language_](http://www.amazon.com/dp/0321958322/) (Bjarne Stroustrup) (updated for C++11) C++の生みの親によるC++の古典的な入門書です。古典的な K&R と並行して書かれているため、実際によく似ており、コア言語から標準ライブラリ、プログラミングパラダイム、言語哲学まで、ほぼすべてをカバーしています。[レビュー]](http://accu.org/index.php?module=bookreviews&func=search&rid=1853) 注:C++標準のすべてのリリースは、この質問で追跡されています。Where do I find the current C++ standard.

  • C++ Standard Library Tutorial and Reference (Nicolai Josuttis) (Updated for C++11) _C++ Standard Library の入門書およびリファレンスです。第2版(2012年4月9日発売)ではC++11に対応しています。 [レビュー]

  • The C++ IO Streams and Locales](http://www.amazon.com/dp/0201183951) (Angelika Langer and Klaus Kreft) この本については、ストリームとロケールについて知りたいのであれば、この本が決定的な答えを見つけるための唯一の場所であるということ以外、ほとんど言うことはありません。[レビュー] C++11/14/17/... 参考文献:

  • The C++11/14/17 Standard (INCITS/ISO/IEC 14882:2011/2014/2017) もちろん、これはC++であるかないかの最終的な判断基準となるものです。ただし、この規格は、理解するために多大な時間と労力を費やすことを厭わない*経験豊富なユーザーのためのリファレンスとしてのみ意図されていることに注意してください。C++17 標準は、電子形式で 198 スイスフランで発売されています。

  • C++17 標準は入手可能ですが、経済的な形態ではないようです。ISO から直接 198 スイスフラン(約 200 米ドル)です。ほとんどの人にとっては、標準化前の最終ドラフトで十分すぎるほどです(しかも無料)。多くの人は、C++20 に含まれる可能性のある新機能を文書化したさらに新しい草案を好むでしょう。

  • Overview of the New C++ (C++11/14) (PDF only) (Scott Meyers) (updated for C++14) C++の著者として高い評価を得ているScott Meyers氏による3日間のトレーニングコースのプレゼンテーション資料(スライドと一部のレクチャーノート)です。項目数が少なくても、質は高いです。

  • C++ Core Guidelines (C++11/14/17/...)](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md)(Bjarne Stroustrup氏とHerb Sutter氏が編集)は、最新のC++を上手に使うためのガイドラインで構成された進化中のオンラインドキュメントです。このガイドラインは、アプリケーションアーキテクチャやライブラリ設計に影響を与えるインターフェース、リソース管理、メモリ管理、同時実行性など、比較的高いレベルの問題に焦点を当てています。このプロジェクトは,Bjarne StroustrupらがCppCon'15で発表したもので,コミュニティからの投稿を歓迎しています。ほとんどのガイドラインには、根拠と例が示されており、ツールによるサポートの可能性についても言及されています。多くのルールは、特に静的解析ツールで自動的にチェックできるように設計されています。

  • The [https://isocpp.org/faq] (Marshall Cline, Bjarne Stroustrup and others) は、Standard C++ Foundation が、Marshall Cline と Bjarne Stroustrup が個別に維持していた C++ の FAQ を統合し、新たな貢献を取り入れるための取り組みです。項目はほとんどが中級レベルの問題を扱っており、しばしばユーモラスな口調で書かれています。すべての項目が、最新版のC++標準に完全に対応しているわけではありません。

  • cppreference.com (C++03/11/14/17/...) (Nate Kohlが始めた)は、基本的なコア言語の機能をまとめたWikiで、C++標準ライブラリの広範なドキュメントがあります。ドキュメントは非常に正確ですが、公式の標準ドキュメントよりも読みやすく、また、ウィキという性質上、ナビゲーションも優れています。このプロジェクトは、C++標準のすべてのバージョンを文書化しており、サイトでは特定のバージョンの表示をフィルタリングすることができます。このプロジェクトはCppCon'14でNate Kohl氏が発表したものです。

    古典/古い

    注意:これらの書籍に含まれる情報は、最新のものではないかもしれませんし、もはやベストプラクティスとは見なされないかもしれません。

  • The Design and Evolution of C++_](http://www.amazon.com/dp/0201543303/) (Bjarne Stroustrup) 言語がなぜこのようになっているのかを知りたければ、この本を読めば答えが見つかるでしょう。C++の標準化以前のすべてをカバーしています。

  • Ruminations on C++ - (Andrew Koenig and Barbara Moo) [Review]

  • Advanced C++ Programming Styles and Idioms (James Coplien) パターン運動の前身であり、C++特有の「イディオム」を多数解説しています。非常に優れた本であり、時間に余裕があれば今でも読む価値があるかもしれませんが、かなり古く、現在の C++ には対応していません。

  • Large Scale C++ Software Design (John Lakos) Lakosは非常に大きなC++ソフトウェアプロジェクトを管理するためのテクニックを説明しています。確かに、これが最新のものであれば、良い読み物です。この本は C++ 98 よりもずっと前に書かれたもので、 大規模プロジェクトで重要となる多くの機能 (たとえば名前空間) を見逃しています。大規模なC++ソフトウェアプロジェクトで働く必要があるならば、この本を読んでみるのもいいかもしれませんが、大目に見る必要があります。新版の第1巻は2019年予定です。

  • Inside the C++ Object Model](http://www.amazon.com/dp/0201834545) (Stanley Lippman) 仮想メンバ関数がどのように実装されているのか、複数の継承シナリオにおいてベースオブジェクトがメモリ上にどのように配置されているのか、そしてこれらがパフォーマンスにどのような影響を与えるのかを知りたいなら、この本でそのようなトピックについて徹底的に議論することができます。

  • The Annotated C++ Reference Manual](https://www.amazon.com/Annotated-C-Reference-Manual/dp/0201514591) (Bjarne Stroustrup, Margaret A. Ellis) この本は、1989 年の C++ 2.0 バージョンを扱っているという点で、かなり古いものです。テンプレート、例外、名前空間、新しいキャストなどはまだ導入されていませんでした。しかし、この本は当時のC++規格全体に目を通し、理論的根拠、可能な実装、言語の特徴などを説明しています。これは、C++のプログラミング原理やパターンを学ぶための本ではなく、C++言語のあらゆる側面を理解するための本です。

  • Thinking in C++ (Bruce Eckel, 2nd Edition, 2000). 全2巻。チュートリアル形式の無料入門書セットです。ダウンロードできます。ダウンロード: vol 1, vol 2.残念なことに、これらの本は多くの些細な誤り(例えば、一時的なものは自動的に const であるとしている)によって損なわれており、公式な正誤表もありません。部分的な3rdパーティの正誤表が(http://www.computersciencelab.com/Eckel.htm)にありますが、明らかにメンテナンスされていません

  • Scientific and Engineering C++:An Introduction to Advanced Techniques and Examples (John Barton and Lee Nackman) この本は、C++で利用可能なすべての機能を、数値計算方法の観点から説明し、利用しようとした、包括的で非常に詳細な本です。当時、Curiously Recurring Template Pattern(CRTP、Barton-Nackmanトリックとも呼ばれる)など、いくつかの新しいテクニックを紹介しています。 また、次元解析や自動微分などの技術も開発されました。 式のパーサーからLapackのラッパーまで、コンパイル可能な便利なコードがたくさん付属していました。 そのコードは今でもここで入手できます: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. 残念ながら、この本はスタイルやC++の機能がやや古くなっていますが、しかし、当時(1994年、STL以前)は信じられないほどの力作でした。 ダイナミクス継承の章は、理解するのに少し複雑で、あまり役に立ちません。 ムーブのセマンティクスやSTLから学んだことを盛り込んだ、この古典的な本の更新版があれば、とてもいいと思います。

解説 (22)