C++ プリマー 第5版
C++11標準に完全に書き直された、包括的で信頼性の高いC++ガイド。このコースでは、基本的な言語要素から複雑なライブラリ機能、高度なクラス作成ツールまで、すべてをカバーしています。
コース概要
📚 コンテンツ概要
完全かつ権威あるC++のガイド。C++11標準に完全に書き直されたこのコースでは、基本的な言語要素から複雑なライブラリ機能、高度なクラス作成ツールまでを網羅する。
現代C++11プログラミングを習得するための業界標準ガイド。
著者: スタンレー・B・リッピマン、ジョゼー・ラジョイ、バーバラ・E・ムー
謝辞: デイブ・アブラハムズ、アンドリュー・コニグ、ステファン・T・ラヴァベイ、ジェイソン・メリル、ジョン・スピーサー、ハーブ・サッター、ビャルネ・ストロウストルプ、アレクセイ・ステパノフ、および標準化委員会のメンバー。
🎯 学習目標
main関数の定義と実装を行い、オペレーティングシステムとの相互作用を理解する。- コマンドラインでのコンパイルを実行し、基本的なI/Oストリーム(
cin、cout)を管理する。 - フロー制御文を使って反復論理の問題(例:出現回数のカウント)を解決する。
- 入力データの連続した出現をカウントおよび処理する論理構造を実装する。
- 制御文内における代入演算子(
=)と等価演算子(==)の違いを区別する。 - クラスオブジェクト(
Sales_item)を使用し、ドット演算子でメンバ関数にアクセスし、カスタムヘッダーファイルを含める。 - 異なる基本型の違いを識別し、型変換や符号なし算術のオーバーフローの結果を予測する。
- C++11の機能(リスト初期化、
nullptr、constexpr、型推論指定子)を実装する。 - 変数の宣言と定義の違いを区別し、スコープ規則を適用して識別子の可視性を管理する。
- 参照とポインタの違いを識別し、
void*を使って汎用的なメモリ操作を行う。
🔹 レッスン1: C++入門と基本的入出力
概要: このレッスンでは、C++プログラムの基礎構造について学ぶ。main関数、基本データ型、コンパイルプロセスに焦点を当て、iostreamライブラリを使った基本的な入出力(I/O)操作、whileおよびforループによる論理実装を扱い、最後にSales_itemクラスを通じてオブジェクト指向の概念を紹介する。
学習成果:
main関数の定義と実装を行い、オペレーティングシステムとの相互作用を理解する。- コマンドラインでのコンパイルを実行し、基本的なI/Oストリーム(
cin、cout)を管理する。 - フロー制御文を使って反復論理の問題(例:出現回数のカウント)を解決する。
🔹 レッスン2: 制御フローと基本的なクラス概念
概要: このレッスンでは、基本的な制御フローから、C++の根本的な強力な機能である「クラス」へと移行する。学生は、データストリーム(連続した出現のカウントなど)を処理するために必要な論理を習得し、Sales_itemクラスを使って組み込み型のように複雑なデータ構造を扱う方法を学ぶ。本単元の終わりには、ファイルリダイレクトとエラー報告を統合した実用的な書籍販売プログラムの実装が行われる。
学習成果:
- 入力データの連続した出現をカウントおよび処理する論理構造を実装する。
- 制御文内における代入演算子(
=)と等価演算子(==)の違いを区別する。 - クラスオブジェクト(
Sales_item)を使用し、ドット演算子でメンバ関数にアクセスし、カスタムヘッダーファイルを含める。
🔹 レッスン3: 基本型と変数
概要: このレッスンでは、C++プログラミングの基礎となるビルディングブロックを解説する。算術型、変数のライフサイクル、メモリモデルについて学び、特に符号なし型の型変換のニュアンス、C++11のリスト初期化構文、ポインタと参照の重要な違いをマスターする。また、const修飾子、型推論(auto、decltype)、プリプロセッサガードを用いた堅牢なカスタムデータ構造の実装についても学ぶ。
学習成果:
- 異なる基本型の違いを識別し、型変換や符号なし算術のオーバーフローの結果を予測する。
- C++11の機能(リスト初期化、
nullptr、constexpr、型推論指定子)を実装する。 - 変数の宣言と定義の違いを区別し、スコープ規則を適用して識別子の可視性を管理する。
🔹 レッスン4: 複合型と現代的な型修飾子
概要: このレッスンでは、C++11の洗練された型システムに焦点を当てる。複合型(ポインタと参照)がconstやconstexprなどの型修飾子とどのように相互作用するかを学び、autoとdecltypeを使った型推論の細部をマスターする。さらに、プリプロセッサヘッダーガードで保護されたカスタム構造体にデータをカプセル化する方法も学ぶ。
学習成果:
- 参照とポインタの違いを識別し、
void*を使って汎用的なメモリ操作を行う。 - 上位レベルと下位レベルの
const修飾子、constexprを分類し、コンパイル時定数として適用する。 - C++11の型推論(
autoとdecltype)を実装し、柔軟で保守可能なコードを書く。
🔹 レッスン5: ライブラリ文字列とベクター
概要: このレッスンでは、組み込み型よりも柔軟で安全な代替手段としての、C++標準ライブラリの基本型stringとvectorについて学ぶ。学生はusing宣言による名前空間アクセスの管理方法、可変長文字列やコンテナの初期化と操作方法、範囲ベースのforループやイテレータを使ってデータコレクションを効率的に処理する方法を学ぶ。
学習成果:
- ヘッダーファイルでの一般的な罠を避けることを前提に、
namespace using宣言を使ってコードを簡潔にする。 - 安全な文字列とベクターの初期化(特にC++11のリスト初期化)を行う。
push_back、範囲ベースのforループ、基本的なイテレータ操作を使って、文字レベルの処理と動的コンテナの成長を実装する。
🔹 レッスン6: イテレータと組み込み配列
概要: このレッスンでは、C++11におけるシーケンスのナビゲーションと管理の基本メカニズムを学ぶ。stringやvectorに対する現代的な高レベルツール(イテレータ)から始まり、低レベルの組み込み配列、ポインタ算術、Cスタイルの文字列へと進む。学生は、レガシーな配列ベースのコードと現代的な標準ライブラリコンテナとのインターフェース方法、複雑な多次元構造の管理方法を学ぶ。
学習成果:
- イテレータとイテレータ算術を使って
stringやvectorコンテナをナビゲートおよび操作する。 - ポインタ算術と
begin/endライブラリ関数を使って、組み込み配列の定義、初期化、ナビゲーションを行う。 - Cスタイルの文字列操作を実装し、組み込み配列を現代的なライブラリタイプと安全にインターフェースする。
🔹 レッスン7: 表式、演算子、変換
概要: このレッスンでは、C++式の基本的な構成要素について学ぶ。言語が演算を評価し、データ型を管理する方法に焦点を当てる。学生は左値(lvalue)と右値(rvalue)の違い、演算子の優先順位と結合規則、算術、論理、ビット演算の仕組みをマスターする。また、暗黙的な算術変換や明示的な名前付きキャストの安全な適用といった、C++型管理の深い理解も提供される。
学習成果:
- 左値(オブジェクトの識別子)と右値(オブジェクトの値)の違いを区別し、式における役割を理解する。
- 優先順位、結合性、ショートサーキット論理を使って、複雑な式の評価順序を予測する。
- ビット演算子を使って低レベルのデータ操作を行い、暗黙的な変換と明示的な名前付きキャストを通じて型安全性を管理する。
🔹 レッスン8: 高度なステートメントと例外処理
概要: このレッスンでは、基本的なステートメントタイプやスコープルールから、高度な条件分岐と反復論理に至るまで、必要不可欠なC++制御フロー構造について学ぶ。また、標準ライブラリの例外階層を使用した、堅牢なエラー処理技術についても紹介される。
学習成果:
- 空のステートメント、単純ステートメント、複合ステートメントの違いを区別し、これらの構造内の変数スコープを管理する。
ifとswitchステートメントを使って複雑な意思決定を実装し、「ダングリング・エルス」のような論理エラーを解決する。- 特定のプログラミングタスクに適した反復構造(
while、for、範囲ベースのfor、do while)を選択し適用する。
🔹 レッスン9: 関数設計と引数渡し
概要: このレッスンでは、C++関数のアーキテクチャについて学ぶ。データがモジュール化されたコードブロックにどのように渡され、戻されるかに焦点を当てる。ローカルオブジェクトのライフサイクル、引数渡しのメカニズム(値渡し対参照渡し)、そしてパラメータの可変性を扱うC++11の標準について探求する。これらの概念を習得することで、効率的で再利用可能かつメモリ安全なコードを書くことができる。
学習成果:
- 引数初期化の方法の違いと、性能およびデータ整合性への影響を区別する。
const修飾子、initializer_list、配列渡し技術を使用して堅牢な関数インターフェースを実装する。- 自動および静的ストレージ期間を使ってオブジェクトの寿命を効果的に管理する。
🔹 レッスン10: 高度な機能とオーバーロード
概要: このレッスンでは、C++関数の複雑なメカニズムに焦点を当てる。引数渡し、オブジェクトの寿命、関数オーバーロードの複雑さについて学ぶ。学生は、パラメータの可変性に対応するinitializer_list、constexpr関数、関数ポインタの宣言と使用方法をマスターし、柔軟でモジュール化されたコードを作成できるようになる。
学習成果:
- 値渡しと参照渡しの違いを区別し、
constパラメータを使うべき状況を特定する。 - オーバーロード解決のルールを適用し、候補関数の中から「最適な一致」を決定する。
- 関数ポインタを実装・管理し、ベクターなどのコンテナや戻り値としての使用方法を学ぶ。
🔹 レッスン11: クラスのカプセル化とコンストラクタ
概要: このレッスンでは、単純なデータ構造から抽象データ型(ADT)への移行について学ぶ。クラス設計のメカニズム、メンバ関数、暗黙的なthisポインタ、オブジェクト初期化におけるコンストラクタの重要な役割に焦点を当てる。さらに、アクセス制御(public/private)を通じたカプセル化と、「友人(friend)」の使用によって、実装詳細を隠蔽しながらクリーンなインターフェースを維持する方法も探求する。
学習成果:
- インターフェースと実装を分離した、
Sales_dataのようなC++クラスを設計・実装する。 - デフォルト、オーバーロード、明示的コンストラクタを使用してオブジェクト初期化のルールをマスターする。
- アクセス指定子とフレンドシップを適用し、カプセル化を強化し、クラススコープを管理する。
🔹 レッスン12: クラススコープと変換管理
概要: このレッスンでは、高度なC++クラス設計のメカニズムに焦点を当てる。単純なデータ構造から堅牢な抽象データ型(ADT)への移行について学ぶ。主なトピックとして、さまざまなコンストラクタタイプによるオブジェクト初期化の管理、explicitキーワードを使った暗黙的型変換の制御、staticメンバやリテラルクラスといったクラスレベルのエンティティの理解が含まれる。
学習成果:
- アクセス指定子とフレンド宣言を使用してカプセル化されたクラス(ADT)を設計・実装する。
- 暗黙的なクラス型変換を管理し、
explicitキーワードを使ってそれを抑制する。 - クラス全体のデータ管理のために、
staticクラスメンバを実装・初期化する。
🔹 レッスン13: ストリームI/Oと順次コンテナの基礎
概要: このレッスンでは、C++標準ライブラリのI/Oシステムと順次コンテナの基本的なメカニズムについて学ぶ。ストリーム状態や出力バッファの管理方法、ファイルおよび文字列ベースのI/O、ライブラリの順次コンテナのナビゲーションを学ぶ。本レッスンでは、イテレータ範囲、コンテナ初期化、コンテナメモリ管理のパフォーマンスへの影響という重要な概念に重点を置く。
学習成果:
- ストリーム状態を照会し、リセットし、出力バッファのフラッシュを制御してストリームの整合性を管理する。
- さまざまなファイルモードを使って
fstreamとsstreamを活用し、永続的およびメモリ内データを扱う。 - アクセスパターンとメモリオーバーヘッドに基づいて適切な順次コンテナを選択し、選択を最適化する。
🔹 レッスン14: コンテナ操作と汎用アルゴリズム
概要: このレッスンでは、C++順次コンテナの管理と、コンテナタイプに依存せずにデータを処理するための汎用アルゴリズムの応用について学ぶ。コンテナがメモリ成長と要素ライフサイクルをどのように扱うか、およびラムダ式や関数バインダーを使ってライブラリアルゴリズムをカスタマイズする方法も探求する。学生は、イテレータカテゴリや専用アルゴリズムを含むライブラリのアーキテクチャをマスターする。
学習成果:
forward_listの専用操作、リサイズ技術、vectorの容量管理を使ってコンテナのライフサイクルを管理する。- 拡張された
stringライブラリとコンテナアダプタを使って、複雑な文字列操作と数値変換を行う。 - プレディケート、ラムダ式、
std::bindを使ってカスタマイズ可能な動作を実装し、データの読み取り、書き込み、並べ替えを行う汎用アルゴリズムを実装する。
🔹 レッスン15: 集約コンテナとスマートポインタ
概要: このレッスンでは、C++11標準の集約コンテナと動的メモリ管理について学ぶ。効率的なキーに基づく検索のために順序付きおよび非順序付きコンテナの使用法、スマートポインタを使った堅牢で例外安全なコードの実装方法について詳述する。本レッスンの終わりには、これらの複雑なデータ構造を統合した現実世界のテキストクエリアプリケーションの設計が行われる。
学習成果:
- 効率的な検索、挿入、サブスクリプション手法を使って集約コンテナを実装・操作する。
- 手動の
new/deleteから、RAIIベースのスマートポインタとallocatorクラスへの移行により、動的メモリ管理をマスターする。 - 参照カウンティングとスマートポインタの所有権を使って、クラス間でデータを安全に共有する複雑なシステムを設計する。
🔹 レッスン16: リソース管理とムーブセマンティクス
概要: このレッスンでは、"ビッグファイブ"特別メンバ関数を通じて、C++クラスがリソースのライフサイクルを制御する方法について学ぶ。学生は、値のような戦略とポインタのような戦略を使って動的メモリを管理し、例外安全なコピー&スワップイディオムを実装し、C++11のムーブセマンティクスと右値参照を使ってパフォーマンスを最適化する方法を学ぶ。
学習成果:
- ルールの三つ/五つの実装と説明を行い、適切なリソース管理を確保し、メモリリークを防ぐ。
- 値のようなクラス振る舞いとポインタのようなクラス振る舞いの違いを区別し、参照カウンティングを実装する。
- 右値参照と
std::moveを使ってムーブセマンティクスを適用し、大きなオブジェクトの不要な深いコピーを排除する。
🔹 レッスン17: 演算子オーバーロードと継承(OOP)
概要: このレッスンでは、演算子オーバーロードを通じて言語の構文を拡張し、オブジェクト指向プログラミング(OOP)による拡張可能なシステムの構築について学ぶ。学生は、組み込み操作と統合するクラスの設計方法を学び、継承、動的バインディング、ポリモーフィックなクラス階層のメカニズムをマスターする。
学習成果:
- C++標準ライブラリの慣例に従ったオーバーロード演算子を設計・実装する。
- 関数オブジェクトと
function型ラッパーを使って、呼び出し可能なエンティティを統一する。 - バーチャル関数、抽象基底クラス、C++11のアクセス指定子を使用して堅牢な継承階層を構築する。
🔹 レッスン18: テンプレートと汎用プログラミング
概要: このレッスンでは、C++テンプレートの基本的および高度なメカニズムについて学ぶ。汎用プログラミングの基盤となるものである。学生は、基本的な関数およびクラステンプレートの定義から始め、C++11特有の機能(可変長テンプレート、パーフェクトフォワーディング、テンプレート特殊化)をマスターする。
学習成果:
- 型パラメータと非型パラメータを使用して、関数およびクラステンプレートを定義・インスタンス化する。
- テンプレートコンパイルモデルを管理し、複数ファイル間でのインスタンス化を制御するために
extern templateを使用する。 - トレーリング戻り値や
std::forwardを用いたパーフェクトフォワーディングを含む、高度な推論技術を実装する。
🔹 レッスン19: 専用ライブラリツールと大規模システム
概要: このレッスンでは、複雑なシステム開発向けに設計された、高度なC++11標準ライブラリコンポーネントと言語機能について学ぶ。専用データ構造、regexライブラリによる堅牢なパターンマッチング、大規模プログラミングのためのアーキテクチャツールをカバーする。さらに、高度な例外処理、名前空間管理、多重継承の複雑さについても探求する。
学習成果:
- 複数の戻り値に
tupleを使用し、ビットレベルのフラグ管理にbitsetを使用する。 regexライブラリを使って複雑な文字列パターンマッチング、検証、変換を実装する。- エンジンと分布を使用して高品質な乱数を生成し、適切な状態とシードを維持する。