
C++が1979年にBjarne StroustrupのもとでBellラボの「C with Classes」として産声を上げてから、初版、ISO初標準化、そしてC++11/14/17/20/23へと続くモダン標準までの歩みを、一本のタイムラインとしてたどります。なぜCを土台にして生まれたのか、SimulaやAlgolといった祖先からどんな影響を受けたのか、三年サイクルの標準化が各世代に何を刻んできたのかをつかみ、C++という言語の「年輪」を直感的に理解できます。
最小構成のHello Worldを実際に動かしながら、`#include <iostream>`、`int main()`、`std::cout << ... << std::endl;`、`return 0;`という4つの要素がそれぞれ何をしているのかを一つずつ読み解きます。コンソールに最初のメッセージを出すところから、複数の値を一気に流してステータス画面のような表示を組み立てるところまで体験し、初めて自分の手でC++コードを走らせる感覚をつかみます。
`std::cout`の頭についている`std::`が何者なのかを、名前空間stdの観点から解き明かします。`using namespace std;`を使う場合と使わない場合のコードを見比べて出力を確認し、大規模プロジェクトではなぜ`using namespace std;`が避けられるのかを理解します。最後に自分で名前空間`my_app`を定義し、ネストや選択的なusing宣言を使ってその中の関数を呼び出すコードを書いてみます。
`std::cin >> name;`でユーザーから名前を受け取り、対話的に値を読み込むプログラムを作ります。`std::string`の宣言、`>>`演算子による入力の流れ、そして空白を含む入力を読むための`std::getline`との違いを、コードと出力の両方で確かめます。仕上げに、名前・レベル・HPなど複数の値を順に受け取ってキャラクター登録画面を完成させる演習に取り組みます。
`//`の1行コメント、`/* */`の複数行コメント、Doxygen形式の`///`ドキュメンテーションコメントを、実際のサンプル関数に付けながら使い分けます。インデントや波括弧の位置、snake_caseとcamelCaseといった命名規約も具体例で身につけ、コメントもフォーマットも整えながら小さなインベントリシステムを完成させる総合演習に取り組みます。
C++を取り巻くエコシステムの全体像を地図のように俯瞰します。GCC・Clang・MSVCという三大コンパイラの個性、ビルドシステムの世代比較、パッケージ管理の二大潮流、そして標準ライブラリの三層構造がどのレイヤーに位置するのかを掴み、日本の現場でのC++採用領域も知ることで、これ以降の講義で「いま自分はどの層を触っているのか」を常に意識できるようになります。
`int`、`double`、`float`、`char`、`bool`といった組込み型を宣言して値を入れ、それぞれの役割と特徴を確かめます。`int`の桁あふれや`float`と`double`の精度差を出力で実感し、`long long`で巨大な累計を扱う例も押さえたうえで、半径から円(魔法陣)の面積を`double`で計算するプログラムを書いて、型の選び方が結果にどう効くかを体験します。
C++11で導入された`auto`による型推論を実際に動かして確かめます。整数リテラルから`int`、小数から`double`、`std::string("...")`から`std::string`へとコンパイラがどんな型を選ぶのかを一つずつ確認し、`auto`の落とし穴も押さえます。最後に、長く書きがちなイテレータの型を`auto`に置き換える例で、その真骨頂と使いどころを掴みます。
`const`と`constexpr`を並べて、実行時定数とコンパイル時定数の違いを実感します。`constexpr`なら配列サイズに使えて`const`では使えない、といった具体例で両者の境界を確かめ、`constexpr`関数でダメージを計算する例も押さえたうえで、消費税率を`constexpr double`で定義して価格から税込価格を求める関数を自分で書きます。
Cスタイルの文字列(`char[]`)とC++の`std::string`を見比べながら、`+`・`+=`による連結、`.length()`、`.substr()`、`.find()`とnposによる検索を実際に動かします。それぞれの操作で結果を確認し、`Link:Hylian:Lv99`のような区切り付き文字列を分解するパーサーを書いて、文字列操作の基本を手に馴染ませます。
C++の型がプリミティブ型、ユーザー定義型(class・struct・enum)、標準ライブラリ型(string・vector・map)の3層に分かれていることを、頭の中に整理します。値型と参照型の違い、後に深掘りする所有権モデルの予告、そして暗黙の型変換が招く落とし穴を概念として押さえ、型を選ぶときの自己診断リストと後続講義へのロードマップを手に入れます。
「使わない機能のコストはゼロ、使う機能は手書きより速く」というStroustrupのゼロオーバーヘッド原則を軸に、C++の設計判断と、その裏返しとして生まれる弱点を見比べていきます。抽象化のコストは何%か、「払うべき代償」とは何か、安全を巡る言語観の違いはどこにあるか——長所と短所を率直に並べ、C++が現場で選ばれる場面と避けられる場面を構造的に理解します。
算術演算子(`+ - * / %`)、比較演算子(`== != < >`)、論理演算子(`&& || !`)をひとつのプログラムにまとめ、それぞれの結果を出力で確かめます。整数除算と浮動小数点除算の違いや、`&&`・`||`のショートサーキット評価の挙動も体験し、3つの数値の中央値を演算子だけで求める式を考える演習に挑戦します。
点数からランクを判定する`if-else if-else`の連鎖を書き、同じロジックを三項演算子`condition ? a : b`で書き直して可読性を比べます。条件分岐をどう書き分けると読みやすいかを掴んだうえで、if文と三項演算子を組み合わせたクエスト評価システムを自分で組み立てます。
番号(0〜6)から曜日に応じた処理を返す`switch`文を書き、`enum class Day`による型安全な列挙型と組み合わせて使います。`break`の役割やフォールスルー(意図的なケースの束ね方を含む)も確かめながら、信号の色(赤/黄/青)に応じた行動を出力する信号機コントローラーを作る演習で、分岐の整理術を身につけます。
従来型の`for (int i = 0; i < 10; ++i)`で1から100までの合計を求めるループと、C++11のrange-based for`for (auto x : vec)`でvectorの要素を集計するループを書き比べます。それぞれの読みやすさを実感したうえで、参照キャプチャ(`auto&`)で`std::vector<int>`の全要素をその場で書き換えるrange-based forを書き、モダンなループの書き方を手に入れます。
条件が満たされるまで処理を繰り返すwhileループと、最低1回は必ず実行されるdo-whileループを書き比べ、それぞれが向く場面を理解します。「quit」と入力されるまで続ける対話ループ、無限ループを`break`で抜ける書き方、`continue`で残りの処理を飛ばす書き方も体験し、入力された値の累乗を計算するwhileループを自分で組み立てます。
C++をC・Rust・Java・Go・Pythonと比べた代表的なベンチマークを通して、この言語の立ち位置を数字で掴みます。実行速度ではC/Rustと肩を並べ、メモリ使用量はGC言語より一桁少なく、その一方でコンパイル時間には大きなコストを払う——という性能プロフィールを把握し、分野別シェアやTIOBE指数での位置から「なぜC++が今も第一線にいるのか」を納得できます。
2つの整数の合計を返す`int add(int a, int b)`を定義し、main関数から呼び出して、戻り値の型・引数リスト・return文がそれぞれ何をしているのかを確かめます。戻り値のない`void`関数や、複数の関数を組み合わせるパイプラインの例も見たうえで、`double`型で精密な計算を行う関数を自分で書き、関数に処理をまとめる感覚を掴みます。
`void swap(int& a, int& b)`の参照渡しと`void swap(int a, int b)`の値渡しを並べて動かし、参照渡しだけが呼び出し元の変数を本当に書き換えられることを目で確かめます。Cから受け継いだポインタ渡し`int*`との関係も押さえたうえで、配列の最大値を見つけて参照引数に書き戻す関数を書き、`&`の威力を体感します。
同じ関数名で引数の異なる版を複数定義する関数オーバーロードと、`int deal_damage(int base, int mult = 2)`のようなデフォルト引数を実際に使います。`print(int)`・`print(double)`・`print(std::string)`の各版を用意して引数の型ごとに正しい版が呼ばれることを確認し(曖昧なオーバーロードの注意点も)、面積関数を「幅と高さ」と「一辺だけ」の2版でオーバーロードする演習に取り組みます。
C++11のラムダ式`[](int x) { return x * 2; }`を書きながら、名前のない関数を自在に扱えるようになります。値キャプチャ`[=]`と参照キャプチャ`[&]`の違いや、`std::sort`へラムダを渡してHP順に並べる使い方を実例で押さえ、`std::count_if`とラムダで`std::vector<int>`の中から偶数だけを数えるコードを自分で書いてみます。
C++が実際に動いている世界を、産業別の象限マップとして見渡します。ゲーム開発、ブラウザエンジン、データベース、デスクトップアプリ、自動車の組込ファームなどを性能要求と安全要求の2軸で分類し、日本企業での代表的な採用例も知ることで、学習のモチベーションが一段上がります。
Cスタイル配列`int arr[]`とC++11の`std::array<int, N>`を見比べ、`.size()`・`.at()`・range-based forとの相性を確かめながら、境界外アクセスの罠も押さえ、なぜ`std::array`が推奨されるのかを理解します。5科目(国数英理社)のテストの点数を`std::array`に格納して平均点を出すコードを書き、固定長コレクションの扱い方を身につけます。
`std::vector`を宣言し、`push_back`・`pop_back`・`size`・`v[0]`によるアクセスを通して、サイズが動的に伸び縮みする様子を出力で確かめます。範囲外アクセスが未定義動作になることも押さえたうえで、`push_back`で溜めた数値の総ダメージを集計するプログラムを書いて、動的配列という主力コンテナを使いこなします。
順序付きの`std::map`とハッシュベースの`std::unordered_map`を見比べ、名前から値へのマッピングを例に`insert`・`[]`アクセス・`find`検索・range-based forでの全走査を動かします。両者の使い分けを掴んだうえで、文字列内の各文字の出現回数を`unordered_map`で数えるプログラムを自分で書きます。
重複を許さない`std::set`と、2つの値を組にする`std::pair`をまとめて使います。`std::set`に挿入すると重複が自動で消える様子や、`std::pair<std::string, int>`で名前と数値をひとまとめに扱う例を確かめ、setとpairを組み合わせて重複を除いた一意なスコアを集計するコードを書きます。
`auto it = v.begin();`から`v.end()`まで進める古典的なイテレータループを書き、`*it`による読み書きや`it++`と`++it`の違いを確かめます。`std::find`や`std::sort`がイテレータを引数に取ることを知り、vectorの中から指定した値を`std::find`で探したり`std::sort`で並べ替えたりするプログラムで、STLを貫く共通の仕組みを掴みます。
C++プログラムが実行時に使うメモリを、スタック・ヒープ・静的領域・テキスト領域という4区画として見渡します。関数呼び出しで自動的に確保されるスタックフレーム、newなどで確保されるヒープそれぞれの寿命とアクセス速度を比べ、なぜスタックは速くヒープは遅いのか、なぜスタックオーバーフローが起きるのか、どんな場面でヒープを使うべきかを理解して、このあとの所有権の議論への足場を固めます。
`std::thread`で別スレッドを起動し、`t.join()`で待ち合わせる並行処理の基本を書きます。複数スレッドが同じ変数にアクセスするときに、`std::mutex`と`std::lock_guard`でどう安全にロックをかけるのかを実演で確かめ、4つのスレッドで分担して合計を計算するプログラムを自分で組み立てます。
`std::async`で重い計算を非同期に走らせ、`std::future`の`fut.get()`で結果を受け取る書き方を学びます。同期版と非同期版の実行時間を測って違いを実感し、ローンチポリシー省略の罠も押さえたうえで、3つの重い処理を並列に起動してすべての結果が揃ったら集計するプログラムを書いて、非同期タスクの組み立て方を身につけます。
生ポインタの`new/delete`がなぜ危ないのかを確かめたうえで、`std::make_unique`による`unique_ptr`と`shared_ptr`で安全に置き換えます。`std::move`による所有権の移転や参照カウントの増減を出力で追い、`Animal`型を管理する`unique_ptr`のvectorを作って各要素の名前を表示するコードで、リークしないリソース管理を体得します。
`template<typename T> T max_val(T a, T b)`という関数テンプレートと`template<typename T> class Stack`というクラステンプレートを書き、int・double・stringそれぞれの型でインスタンス化される様子を確かめます。1つのコードが多くの型に対応するジェネリックプログラミングの威力を実感し、任意の型の配列の合計を返す関数テンプレート`sum_all`を自分で書きます。
C++20のConceptsを使い、`template<std::integral T> T square(T x)`のようにテンプレートへ型の制約を課す書き方を学びます。制約に違反したときに出るエラーメッセージが、従来のSFINAEエラーよりどれほど読みやすいかを見比べ、`std::floating_point`制約を使った数値計算関数を書いて、安全で意図の伝わるテンプレートを書く力を身につけます。
手書きのループの代わりに`std::transform`・`std::accumulate`・`std::for_each`・`std::count_if`といったSTLアルゴリズムを使い、ラムダ式と組み合わせて`std::vector<int>`を変換・集計する処理を短く書きます。`transform_reduce`で総和を一発計算する例や、条件に合う要素だけを`count_if`で数えるコードをアルゴリズムだけで書く演習で、宣言的なスタイルを掴みます。
コンストラクタで資源を取得し、デストラクタで自動的に解放するRAIIというC++固有のイディオムを、ライフサイクルとともに理解します。この仕組みがなぜメモリリーク・ファイルリーク・ロック解放忘れを構造的に防ぐのかを掴み、RAIIを体現する標準クラスや他言語との比較を通して、C++ならではの所有権哲学の優雅さがはっきり見えてきます。
`throw std::runtime_error(...)`で例外を投げ、`try { ... } catch (const std::exception& e) { ... }`で捕まえる例外処理の流れを書きます。`std::runtime_error`や`std::logic_error`といった例外クラスを実例で押さえ、値ではなく参照で捕まえる作法も学んだうえで、独自例外`DivideByZero`を作って投げる関数を書き、エラーを安全に扱う作法を身につけます。
C++17の`std::optional<int>`で「見つかるかもしれない/見つからないかもしれない」関数を表現し、戻り値に値の有無を素直に込める書き方を学びます。`value_or`による欠損時のデフォルトや、`std::variant`による型安全なユニオンと`std::visit`によるパターンマッチも動かし、optionalとvariantを統合した宝箱システムを組み立てる演習に取り組みます。
`auto [name, age, score] = student;`という構造化束縛と`std::tuple`を使い、複数の値をまとめて返したり一度に取り出したりする書き方を学びます。マップをrange-based forで走査するときの`auto& [key, value]`という慣用表現も押さえ、最小値と最大値を同時に返す関数をtupleで作って構造化束縛で受け取る演習に取り組みます。
C++20のRangesライブラリで、`std::views::filter`と`std::views::transform`のように処理をパイプラインでつなぐ書き方を学びます。条件で要素を絞り込んだり値を変換したりする様子や、従来のSTLアルゴリズム連鎖と比べた読みやすさを体感し、`std::views::iota`と`take`を組み合わせて無限の数列から必要な分だけ取り出すパイプラインを自分で書きます。
C++20で導入されたコルーチンの基本形を、シンプルなジェネレータ`Gen<T>`として書きます。`promise_type`やイテレータの仕組みを押さえ、`co_yield`で値を遅延的に生み出す関数を作ってrange-based forで消費する様子を確かめ、フィボナッチ数列を無限に生成するコルーチンを書いて最初の数個だけ取り出す演習で、新しい制御フローの感覚を掴みます。
C++11のムーブセマンティクスがなぜ性能革命だったのかを、コピーとムーブのコスト比較として読み解きます。深いコピーが招くメモリ確保のオーバーヘッド、ムーブされたあとの「抜け殻」状態、右辺値参照という新しい型、そして`std::move`が実は命令ではなく単なる「目印(キャスト)」にすぎないという真実を理解し、所有権が移るとは何が起きることなのかを概念モデルとして腑に落とします。
C++で特に頻出する10種類のデザインパターン(Singleton、Factory、Observer、Strategy、Visitor、PIMPL、Template Method、CRTP、RAII Wrapper、Type Erasure)を、生成・構造・振る舞いのカテゴリに整理して見渡します。それぞれのパターンが解く典型問題と、テンプレート・ヘッダ分離・ABI互換性といったC++ならではの実装上のクセを掴み、パターン選択のための観点とともに設計の引き出しを増やします。
C++特有の「未定義動作(UB)」が、なぜ単なるバグではなく仕様上の地雷なのかを理解します。整数オーバーフロー、nullポインタのデリファレンス、データ競合、配列範囲外アクセスといった代表的なUBを押さえ、コンパイラが「UBは起きない」と仮定して攻撃的に最適化することで想像を絶する挙動が生まれる実例を知り、UBを避けるための実践的な原則まで身につけます。
1つの.cppファイルが実行可能バイナリになるまでの4工程——プリプロセス、コンパイル、アセンブル、リンク——をフローとしてたどります。ヘッダインクルードの展開、テンプレートの実体化の重さ、One Definition Rule(ODR)とリンカエラー、そしてビルドを速くする現代の武器(LTOなど)を順を追って理解し、現場でビルド時間と格闘するときに効く土台の知識を手に入れます。
This course contains the use of artificial intelligence.
C++は半世紀近くにわたり、OS、ゲームエンジン、金融取引システム、ブラウザ、組み込み機器、AIフレームワークの心臓部を支え続けてきた言語です。ハードウェアに最も近い高水準言語として「ゼロオーバーヘッド原則」を掲げ、Rustが台頭する現代においても圧倒的な性能と既存資産で揺るぎない地位を維持しています。しかしC++11以降の進化は凄まじく、ムーブセマンティクス、ラムダ式、スマートポインタ、Concepts、Ranges、コルーチンといった機能群は、もはや「古いC++」とは別言語と言えるほどです。今こそ、モダンC++を体系的に学び直す絶好のタイミングなのです。
本コースは、C++という言語を「文法の暗記」ではなく「設計思想と内部メカニズム」から理解することを目的としています。そのために各コーディングセクションは、まず短い概念講義で「なぜそうなっているのか」「どんな歴史と背景があるのか」を一望してから、すぐに手を動かすハンズオンのコーディング講義へと入っていく構成になっています。Hello Worldの裏にある言語の年輪、型システムを支えるエコシステム、メモリモデルや所有権の考え方を概念講義で押さえ、そのうえで変数・型・autoによる型推論、制御フロー、関数、参照渡し、ラムダ式、std::vector・std::map・イテレータといったSTLコンテナを一段ずつ実装していきます。さらにstd::threadによる並行処理、スマートポインタ、テンプレート、C++20 Concepts、例外処理、std::optional・std::variant、構造化束縛、Rangesライブラリ、そしてコルーチンまで、概念とコードを織り交ぜながら走り抜けます。ハンズオンの題材には、HPやダメージ計算、戦利品やパーティ管理といったRPGゲーム風の親しみやすい例を一貫して用い、抽象的になりがちな文法を具体的なイメージとともに体に染み込ませます。
全7セクションで構成され、最初の一歩からモダンC++の最新機能までを段階的に積み上げます。そしてコースの締めくくりには、ムーブセマンティクスと右辺値参照の本質、C++の代表的なデザインパターン地図、未定義動作(UB)とコンパイラ最適化の危険な関係、そしてコンパイル工程という一段深い概念講義をまとめて配置し、それまで書いてきたコードが「なぜ動くのか」を原理から腑に落とします。
対象は、他言語(Python、Java、JavaScriptなど)の経験があり本格的にC++へ踏み込みたい方、古いC++(C++98/03)の知識をモダンC++へアップデートしたい現役エンジニア、ゲーム開発・組み込み・高性能計算・システムプログラミングを目指す学生や転職希望者です。前提知識はプログラミングの基本概念(変数、関数、ループ)と、コマンドラインの基本操作のみ。コース修了時には、自力でモダンC++のコードを設計・実装・デバッグでき、所有権とライフタイムを意識した安全で高速なコードを書けるようになります。
本コースの特徴は、単なる文法解説に留まらず「なぜそうなっているのか」というC++特有の設計判断とトレードオフを日本語で丁寧に解説する点にあります。コンパイラがどう最適化し、なぜUBが危険なのか、RAIIがどう資源を守るのか、ムーブが何をムーブしているのか——表面ではなく原理まで降りて理解することで、応用が利く本物のスキルが身につきます。今すぐ受講登録して、現代のC++エンジニアへの第一歩を踏み出しましょう。