お勧めの C++ 本をいくつか教えてください。

この記事は友人からの質問に対する回答です。

一、冗談だよ!

C++ の本は川を渡るフナと同じくらいたくさんあります。私の言うことを信じない人は、次の本を見てください。

手動クラス:

  1. 「C++ プログラミング言語」

  2. 「C++ 標準ライブラリのチュートリアルとリファレンス」

  3. 《C++ IO ストリームとロケール》

  4. 《C++標準(INCITS/ISO/IEC 14882-2011)》

  5. 《新C++(C++11/14)の概要》

  6. 《標準Cライブラリ》

主要な:

  1. 《C++入門》

  2. 《高速化されたC++》

  3. 「C++で考える」

  4. 「プログラミング: C++ を使用した原則と実践」

  5. 「C++ 入門ガイド」

  6. 《C++入門プラス》

  7. 「Visual.C++.2008 クラシック入門」

  8. 「オブジェクト指向プログラミング - C++ 言語の説明」

  9. 『データ構造(C++言語編)第3版_Deng Junhui』

実用的:

  1. 《効果的なC++》

  2. 《効果的なSTL》

  3. 「シンプルな中に奥深いデザインパターン」

  4. 「デザインパターン: 再利用可能なオブジェクト指向ソフトウェアの基礎」

  5. 「ヘッドファーストデザインパターン」

  6. 「ビッグトークデザインパターン」

中級:

  1. 《より効率的な C++ 》

  2. 《卓越したC++》

  3. 《さらに優れた C++》

  4. 《卓越したC++スタイル》

  5. 「C++ プログラミング標準 (C++ コーディング標準)」

  6. 「C++ テンプレート: 完全ガイド」

  7. 《C++標準ライブラリを超えて(ブースト)》

  8. 「C および C++ セキュア コーディング」

  9. 「C++11の深い理解」

高度な:

  1. 「C++ 設計における新しい考え方 - 汎用プログラミングと設計パターンの適用 (最新の C++ 設計)」

  2. 「C++ テンプレートのメタプログラミング」

  3. 《C++ 同時実行の動作》

  4. 《高度な C++ プログラミング スタイルとイディオム》

  5. 《リアルタイム C++ の効率的なオブジェクト指向とテンプレート マイコン プログラミング》

  6. 《クラシックCにおける高度なメタプログラミング》

古典的な古代:

  1. 「C++の設計と進化」

  2. 「C++ についての反芻」

  3. 「大規模C++ソフトウェア設計」

  4. 「C++ オブジェクト モデルの内部」

たくさん挙げましたが、本当に見ていただけますか?読んだとしてもあまり儲からなかったり、時間がかかったりして、最終的には半分の労力で2倍の成果が得られます。

2. C++の学習方法

C/C++ 言語は他の高級言語とは異なり、オペレーティング システムに近い言語です。したがって、C/C++ システムの技術スタックをよく学ぶには、オペレーティング システムの動作メカニズムと組み合わせて学ぶ必要があります。平たく言えば、オペレーティング システム レベルでのいくつかの基礎知識を習得する必要があります。コンパイルリンクとランタイムシステム、狭義の操作、システム原理、マルチスレッド、ネットワークプログラミング、このように学ぶことによってのみ、学んだことを理解し、理解し、応用することができます。C++ は理論研究のためではなく、実際に運用して本番環境に導入するために学びましょう。

3. C++11/14/17 の共通文法を含む C++ 言語をよく学ぶ

C++ の面接では通常、文法部分について次の質問が行われます。もちろん、これらの質問は C++ 開発にも必要です。

  1. 継承関係のある親子クラスにおいて、サブクラスのオブジェクトを構築、破棄する際の親子コンストラクタ、デストラクタの実行順序はどうなるでしょうか?

  2. 継承関係のあるクラスシステムでは、親クラスのコンストラクターとデストラクターを仮想宣言する必要がありますか? 仮想として宣言しないとどうなりますか?

  3. C++ ポリモーフィズムとは何ですか? C++ ポリモーフィズムの実装原理は何ですか?

  4. 仮想関数とは何ですか? 仮想機能の実現原理は何ですか?

  5. 仮想テーブルとは何ですか? 仮想テーブルのメモリ構造レイアウトは何ですか? vtable の最初 (または 2 番目) のエントリは何ですか?

  6. ダイヤモンド継承 (クラス D は B と C の両方を継承し、B と C は A を継承) システムでは、各クラスの仮想テーブルのレイアウトはどうなりますか? クラス B とクラス C のメンバーが同時に m を変更した場合、m は D オブジェクトのメモリ アドレスにどのように分散されますか? 相互にオーバーライドされますか?

学生の中には、上記のような疑問がよく分からないのに、どうやって勉強すればいいのか分からず、ネットで色々な記事を検索して学んでいるという人がいますが、知識が断片的で体系化できていないのです。インターネットに多くの時間を費やす方が良いです。Hou Jie 氏が翻訳した書籍「Deep Exploration of the C++ Object Model」を体系的に見てみましょう。(リンク: https://pan.baidu.com/s/1oshiEAV3kwitKCMXV6wKSg抽出コード: obni )

この本は、構造セマンティクス、一時オブジェクトの生成、カプセル化、継承、仮想仮想関数と仮想継承など、C++ オブジェクト指向プログラミングの基礎となるメカニズムに焦点を当てています。この本では、基礎となる実装モデルを理解できれば、プログラム コードの効率がどれほど向上するかを知ることができます。C++ の基本的な仕組みに興味がある読者にとって、これは夢中になってしまう素晴らしい本です。

さらに、現在でも、大手企業は C++11/14/17 で一般的に使用されている言語機能やクラス ライブラリをプロジェクトで使用していない場合がありますが、面接では依然としてこれらに対する一定の要件があります。

  • 統合されたクラス メンバーの初期化構文と std::initializer_list<T>

  • アノテーションタグ(属性)

  • Final/override/=default/=delete 構文

  • 自動キーワード

  • 範囲ベースのループ構文

  • 構造化バインディング

  • stl コンテナの新しいユーティリティ メソッド

  • std::スレッド

  • スレッドローカルストレージ thread_local

  • スレッド同期プリミティブ std::mutex、std::condition_variable など。

  • アトミック操作クラス

  • スマート ポインター クラス

  • std::bind/std::function

C++11/14 についてはインターネット上にすでに多くの情報がありますが、C++17 についてはあまり情報がありません。ハイライトは、C++11 で導入されたさまざまな実用的な機能です。ここでいくつかの良い本を紹介します。読みました:

  • 「C++11の深い理解:C++11の新機能の分析と応用」

  • 「C++11 の徹底した応用: コードの最適化とエンジニアリングレベルの応用」

  • C++17 完全ガイド

  • 《第17条の詳細》

リンク: https://pan.baidu.com/s/1MfvlrHqsDMtga8gW7JNgzA抽出コード: thup

4、C++の改善

C++ 言語自体を学習したら、C++ の一般的なイディオムと高パフォーマンスのコーディング手法を学ぶことができます。ここでは、「C++ パフォーマンスを向上させるプログラミング テクニック」という古典的な本をお勧めします。この本では、一時オブジェクトについて詳しく説明しています。メモリ管理、継承、仮想関数、インライン化、参照カウント、stl など、C++ の効率を向上させる可能性のあるすべての詳細。最後に、この本は、C++ のパフォーマンスを向上させるためのさまざまな最終兵器を読者に完璧に提示します。なによりこの本は薄いのですが、紹介されている内容はどれも実戦でよく使われるテクニックばかりなのでとてもお勧めです。

リンク: https://pan.baidu.com/s/1RPgJoLL_CoOt5onKwdBbdQ抽出コード: to6o

5. C++ エンジニアリングの実践

一般的な C++ 文法、言語の背後にある実装メカニズムと一般的なイディオムをマスターした後は、他の 2 冊の本を強くお勧めします。1 冊は「C++ API Design」と「Large-Scale C++ Programming」です。前者は詳細な方法から教えてくれます。実際の開発で C++ API インターフェイスを設計するために、後者では、単一の .h/cpp ファイルほど小さい大規模な C++ プログラムを作成する方法と、大規模な C++ プロジェクトを編成する方法を説明します。この2冊はエンジニアリングの実践本であり、本書に掲載されているテクニックは実際に開発の現場で活用できます。

6. その他の知っておくべきことと知っておくべき基本事項

最初の基礎知識はアセンブリです。面接や就職活動のためだけに C/C++ を学ぶ必要がないのと同じように、アセンブリを学ぶときにコードを書くためにアセンブリを使用する必要はありません。

C/C++ の学生には、アセンブリをマスターすることをお勧めします。この方法でのみ、C++ コードを作成するときに、C++ コードの各行にどのような種類の機械命令が対応しているかを明確に知ることができます。 /while として、関数の戻り値を返す方法、整数変数の数学的演算がアトミックではない理由、そして最終的には最高の効率を達成するコードの書き方がわかります。アセンブリをマスターすると、スタック オブジェクトの構築から破棄までのライフ サイクル全体で、開発者のコ​​ード、コンパイラ、オペレーティング システムが何を行うかを C++ で理解できるようになります。アセンブリをマスターすると、関数呼び出しがどのように実装されるかを理解できるようになり、printf などの関数の呼び出しメソッドが __stdcall ではなく __cdecl でなければならない理由など、関数のいくつかの呼び出しメソッドを理解できるようになります。アセンブリをマスターすると、クラス オブジェクトにメソッドを追加しても、そのメソッドが占有する実際のメモリ領域が増加しない理由が理解できます。お勧めの書籍は、Wang Shuang氏の「Compilation (Third Edition) 」とHanHong氏の「マシンコードからフレームワークへのシステムビューの逆実践」です。

王双『総集編(第3版)』

リンク: https://pan.baidu.com/s/12j-dUDWY1o7AZ4d4Hel1aQ抽出コード: fhep

「マシンコードからフレームワークシステムビューへの道筋を知る古いコードの逆練習ロード」

リンク: https://pan.baidu.com/s/14VDfyQahIOsV34OleEFdng抽出コード: b83j

2 番目の基本知識は、コンパイル、リンク、および実行時システムの知識です。開発者として、作成した C/C++ プログラムが前処理、コンパイル、リンクなどの手順を経て最終的に実行可能バイナリ ファイルにどのように変換されるか、オペレーティング システムがファイルを実行可能ファイルとして認識する方法、および実行可能ファイルを明確に知らなければなりません。ファイルには何が含まれているか、実行中にプロセスのアドレス空間にファイルをロードする方法、プログラムの各変数とデータがプロセスのアドレス空間のどこに配置されるか、およびそれを参照する方法。プロセスのアドレス空間の内容は何か、各アドレス セグメントにどのような内容が分散されているか、NULL ポインタやワイルド ポインタの読み書き時にメモリの問題が発生する理由。プロセスが各 so または dll ファイルにどのようにインストールされるか、これらのファイルがプロセスのアドレス空間にロードされる場所、それらがどのように実行されるか、およびデータがどのように交換されるか。

3つ目の基礎知識は、狭義のオペレーティングシステム原理です。ここで「狭義」という言葉を付け加えたのは、広義には上記の内容がオペレーティングシステム原則の範囲となるためである。狭義のオペレーティング システムの原則には、オペレーティング システムがプロセスとスレッドを管理する方法、仮想メモリと物理メモリの対応、メモリ マップト ファイルとは何か、プロセス間の通信方法などが含まれます。

この二人が推奨する書籍リスト:『プログラマの自己修養』と『Windows Core Programming』、特に『プログラマの自己修養』は、C++開発に携わる人はこの本を読まないと意味がありません。すべての C++ 言語の本!

「プログラマーの自己研鑽」

リンク: https://pan.baidu.com/s/1SlBs7_0d0CGt3RAG6tH4Sg抽出コード: 5qqk

「Windowsコアプログラミング」

リンク: https://pan.baidu.com/s/1Wpa2CJdlqxtgeynNmqdSog抽出コード: jjcs

4つ目の基礎知識はマルチスレッドの知識です。厳密に言えば、この点は 3 番目の点に含まれますが、これを分けて記載した理由は、マルチスレッド プログラミングがアプリケーション サービスを行うために最も一般的に使用されるテクノロジの 1 つであるためです。最近、非常に優秀な学力を備えた数人の学生にインタビューしましたが、メモリの問題によりプロセス内のスレッドが終了した場合、プロセス全体が終了しますか? これにはうまく答えられません。マルチスレッドの知識は実際に習得するのは難しくなく、面接に対処するよりも理解と実践に基づいて非常によく習得できます。Windows であっても Linux オペレーティング システムであっても、オペレーティング システムが提供するスレッド同期オブジェクトは数種類しかありません。Windows で一般的に使用されるのは、クリティカル セクション (キー端末)、イベント、ミューテックス、セマフォなどです。Linux にはミューテックスがあります。 、セマフォ、読み書きロック、条件変数、これらの知識ポイントは学習されますが、学習されません。これらのスレッド同期プリミティブは数日で理解できます。ほとんどの学生は学習できないわけではありませんが、学習する気はありませんが、マルチスレッド プログラミングに精通していると履歴書に書きたがります。面接中に、条件変数の誤ったウェイクアップの仕組みについて質問されましたが、明確に説明できず、条件変数を使用したと答えるしかありませんでした。これは一部の学生が犯した非常に低レベルの間違いですが、実際に条件変数を使用する場合、誤ったウェイクアップ メカニズムを知らない場合は、作成したコードが間違っているに違いありません。現在、上記のような知識形成システムを紹介した本は市販されていませんが、もちろん、私の本はそのギャップを埋めるものであり、プロセスとスレッドの関係から、よく使われるスレッド同期プリミティブの違いと使い方まで、この本で学ぶことができます。次に、プロデューサー/コンシューマー モデルに基づくスレッド プールとメッセージ キュー、およびコルーチンのアイデアの導入に関する関連知識を学びます。

一般的なマルチスレッド同期プリミティブを習得したら、UI の有無に関係なく、学習すべきマルチスレッド プロジェクトを見つけることができます。私がお勧めする 1 つの方法は、gdb または Visual Studio デバッガーを使用して、学習する必要があるマルチスレッド プログラムを中断することです。マルチスレッド パネルで、このプロセスで実行されているスレッドの数を確認し、各スレッドの役割を分析します。そして、これらのスレッドがいつ、どこで作成されたのか、なぜ新しいスレッドを作成する必要があるのか​​を調べます。数人を愛してみると、愛に対してもっと正直になれるし、いくつかのマルチスレッド プロジェクトを研究してみると、マルチスレッドに対してさらに熟練できるようになる。

おすすめ書籍リスト「C++サーバー開発のエッセンス

5つ目はネットワークプログラミング、端的に言えばソケットプログラミングです。オペレーティング システム レベルで提供される API は、インターフェイスを長期間変更せずに維持し、一度学習すると生涯使用されます。一般的に使用される基本的なソケット API を理解して習得すると、市場で人気のあるネットワーク通信ライブラリの使用は言うまでもなく、さまざまなネットワーク通信フレームワークのカスタマイズを最大限に活用できるだけでなく、最も重要なことは、さまざまなネットワーク問題のトラブルシューティングに役立つことです。テクニカルサポート。OSレベルで提供されているネットワークモデルは数えるほどしかなく、Java/Go/Pythonなどの言語がいかにパッケージ化されていても技術の源として使いこなせないのはなぜでしょうか。推奨書籍「TCP/IP ネットワーク プログラミング」および「Linux ハイ パフォーマンス サーバー プログラミング」。

「TCP/IPネットワークプログラミング」

リンク: https://pan.baidu.com/s/1dh97rPB7DkAq0_iAAWtOYA抽出コード: b8qb

「Linux ハイパフォーマンスサーバープログラミング」

リンク: https://pan.baidu.com/s/1Hujkjl4dOe45g-y-7AgYVQ抽出コード: 43cq

上記は C++ テクノロジ スタックに基づいており、アルゴリズム、データ構造、データベースの基本的なスキルは含まれていません。全体として、C++ の学習では、C++ の文法自体に焦点を当てるだけでなく、C++ テクノロジ スタックの背後にある一連のオペレーティング システムの原則にも精通する必要があります。

7. C++ テクノロジー スタック ブックの完全なリスト

ここでは、私が最初に C++ を学んだ書籍のリストを慎重にまとめましたので、それを共有します。

パソコン必読の名著(ダウンロード方法含む

オリジナリティを出すのは簡単ではありませんが、役に立ったと思ったら、高評価をお願いします~

おすすめ

転載: blog.csdn.net/analogous_love/article/details/119381966