第3回まで無料

C++ 入門コース

clang++ でのビルドと iostream から、クラスと RAII・STL・テンプレート・スマートポインタ・ranges とスレッド、そして CMake とユニットテストまで。全50レッスンで「資源の寿命を型に任せ、小さなツールを 1 本ビルドして配れる」ところまで進みます。コード・コンパイルエラー・サニタイザの報告はすべて clang++ 21(C++23)で実際に動かしたものです。

カリキュラム

全50レッスンを7つの章に分けています。第1章から順に進めるのがおすすめですが、 気になるところだけ拾い読みしてもかまいません。 ※ C++ はブラウザ内で実行できないため、手元の clang++ 16 以降か g++ 13 以降(C++23 対応)でコンパイルして試してください。C の知識(ポインタと malloc)がある前提で書いています。

Chapter 1 — C から C++ へ(第1〜7回)

C で書けるコードを C++ の道具で書き直しながら、iostream・参照・名前空間・auto・範囲 for・オーバーロードを覚えます。この章を抜ければ、C のコードを C++ として読み書きできるようになります。

1

C++ の最初の一歩(clang++ でビルドする)

C を知っている人が最初に触る差分だけを見る。clang++ でのビルド、iostream の Hello World、printf との違い、そして C のコードが C++ で通らなくなる 1 か所。

Free
2

std::string と入出力

char 配列と '\0' の管理から解放される。連結・比較・部分取り出し、1 行入力、そして std::endl を毎行書いてはいけない理由を実測で確かめる。

Free
3

参照(&)— ポインタを書かずに書き換える

C で & と * を並べていた「呼び出し元を書き換える関数」を参照で書き直す。参照は付け替えられない別名であること、大きな値を const 参照で受けるとコピーが消えることを番地で確かめる。

Free
4

名前空間と using

同じ名前の関数がぶつかる場面を作ってから namespace で囲う。using namespace std を書かないほうがいい理由、名前空間の別名、C の static に代わる無名名前空間。

🔒 ベーシック
5

auto と範囲 for

型名を書かずに済ませる auto と、添字ループを置き換える範囲 for。auto & を付け忘れるとコピーになること、auto が意図しない型を拾う落とし穴まで。

🔒 ベーシック
6

関数のオーバーロードとデフォルト引数

同じ名前で型ごとの関数を用意する。どれが選ばれるかの順番、曖昧になって止まる場面、デフォルト引数と組み合わせたときの事故まで。

🔒 ベーシック
7

nullptr・enum class・構造化束縛

C から引き継いだ危なっかしい書き方を、C++ の置き換えで潰す。NULL と nullptr の違い、型が付く列挙、戻り値を 2 つ受け取る構造化束縛。

🔒 ベーシック

Chapter 2 — クラスと RAII(第8〜14回)

データと振る舞いをクラスにまとめ、コンストラクタとデストラクタで資源の寿命を型に任せます。コピー・ムーブ・演算子オーバーロードまで進み、最後は自分で書いた型が = や + で自然に使えるところまで行きます。

8

クラスとメンバ関数

C の struct に関数を入れる。public と private で触れる範囲を仕切り、const メンバ関数で「読むだけ」を型に書く。

🔒 ベーシック
9

コンストラクタと初期化子リスト

生成と同時に決まった状態にする。本体での代入と初期化子リストの違い、初期化の順番、委譲コンストラクタ、そして const メンバの扱い。

🔒 ベーシック
10

デストラクタと RAII

スコープを出た瞬間に呼ばれるデストラクタ。fopen と fclose を型に閉じ込め、途中で return しても閉じ忘れが起きない形を作る。

🔒 ベーシック
11

コピーコンストラクタと Rule of Three

既定のコピーはメンバごとの浅いコピー。生ポインタを持つクラスで二重解放を実際に起こし、コピーコンストラクタ・コピー代入・デストラクタを三点セットで用意する。

🔒 ベーシック
12

ムーブセマンティクス

コピーせずに中身を引っ越す。右辺値参照 && と std::move、ムーブコンストラクタとムーブ代入、そして Rule of Five。

🔒 ベーシック
13

explicit と暗黙の変換

引数 1 つのコンストラクタが勝手に呼ばれて起きる事故。explicit で止める、{} 初期化で縮小変換を止める、explicit operator bool で if にだけ使う。

🔒 ベーシック
14

演算子オーバーロード

自分で作った型を + や == や << で使えるようにする。メンバ関数にするか外の関数にするかの使い分け、<=> で比較を 1 行にまとめる方法まで。

🔒 ベーシック

Chapter 3 — STL(第15〜22回)

vector・map・set と、それらを串刺しにするイテレータとアルゴリズムを覚えます。自分でループを書いていた処理が <algorithm> の 1 行になり、ラムダ式で「どう比べるか」をその場で渡せるようになります。

15

std::vector の基本

malloc と realloc で書いていた「伸びる配列」を置き換える。追加・参照・削除、範囲の外を触ったときの違い、二次元の作り方まで。

🔒 ベーシック
16

vector が伸びる仕組み(capacity と reserve)

size と capacity の違いを実測する。再確保が何回起きるか、reserve でどれだけ速くなるか、そして再確保で参照が無効になる事故をサニタイザで見る。

🔒 ベーシック
17

std::map と std::unordered_map

キーで引く入れもの。並ぶ map と速い unordered_map、[] が勝手に要素を作る落とし穴、contains と find の使い分け。

🔒 ベーシック
18

std::set と重複の除去

入れるだけで重複が消え、並ぶ入れもの。insert の戻り値で「新しく入ったか」を知る、順番の基準を自分で決める、unordered_set との使い分け。

🔒 ベーシック
19

イテレータ

入れものの種類によらず中身をたどる共通の道具。begin と end の半開区間、ポインタとの関係、種類ごとにできることの違い、そして無効化。

🔒 ベーシック
20

<algorithm> の定番

自分で書いていたループを 1 行にする。並べ替え・検索・数え上げ・合計、消して詰めるイディオム、そして二分探索。

🔒 ベーシック
21

ラムダ式

その場で書く小さな関数。書式、値キャプチャと参照キャプチャ、mutable、戻り値の型、寿命の落とし穴、そして std::function。

🔒 ベーシック
22

アルゴリズムとラムダを組み合わせる

売上データを題材に、並べ替え・絞り込み・変換・集計をつないで書く。back_inserter と transform、accumulate に渡す二項演算、そして安定な並べ替え。

🔒 ベーシック

Chapter 4 — テンプレート(第23〜29回)

同じ処理を型ごとに書き写すのをやめ、テンプレートで 1 本にまとめます。特殊化・パラメータパック・constexpr・コンセプトまで進み、テンプレートのエラーを自分で読めるところまで行きます。

23

関数テンプレート

型ごとに同じ関数を書き写すのをやめる。型の推論、明示的な指定、2 つ以上の型引数、そして実体化されるまでエラーが出ないという性質。

🔒 ベーシック
24

クラステンプレート

std::vector のような「中身の型を選べる型」を自分で作る。メンバ関数の書き方、型ではない引数、そして引数からの型推論(CTAD)。

🔒 ベーシック
25

テンプレートの特殊化

ある型のときだけ中身を差し替える。完全特殊化と部分特殊化、関数ではオーバーロードを選ぶ理由、そして特殊化が選ばれる順番。

🔒 ベーシック
26

可変長引数テンプレート

引数の個数を決めずに受け取る。パラメータパックと sizeof...、畳み込み式で 1 行にまとめる、完全転送で受け取ったものをそのまま渡す。

🔒 ベーシック
27

constexpr と consteval

計算をコンパイル時に済ませる。constexpr 関数と static_assert、必ず定数にする consteval、そして型で分岐する if constexpr。

🔒 ベーシック
28

コンセプト(concepts)

テンプレートに「どんな型なら使えるか」を書く。標準のコンセプト、requires での自作、そしてエラーメッセージがどれだけ短くなるかの比較。

🔒 ベーシック
29

型推論の落とし穴とテンプレートのエラーを読む

auto が const と参照を落とすこと、decltype と decltype(auto)、依存した型に typename が要ること、そして長いエラーの頭から読むコツ。

🔒 ベーシック

Chapter 5 — メモリと所有権(第30〜36回)

new と delete が壊れる場面を実際に壊して見せてから、unique_ptr と shared_ptr に置き換えます。例外が飛んでも資源が漏れない書き方を身につけ、最後は Rule of Five を自分で書いた文字列クラスで確かめます。

30

new と delete、そして生ポインタの問題

malloc と free が new と delete になっただけでは何も解決しない。[] の付け忘れ、返し忘れ、そして「誰が解放するのか」が型に書けないという根本の問題。

🔒 ベーシック
31

unique_ptr

ただ 1 人の持ち主を型に書く。make_unique、コピーできずムーブだけができること、関数の引数と戻り値での使い方、独自の後始末。

🔒 ベーシック
32

shared_ptr と weak_ptr

持ち主が複数いるときの参照カウント。use_count の動き、循環参照で漏れること、weak_ptr で輪を断つこと、make_shared を使う理由。

🔒 ベーシック
33

例外(throw・try・catch)

戻り値で伝えられないエラーを投げる。std::exception の仲間、const 参照で捕まえる理由、自作の例外、そして巻き戻しでデストラクタが呼ばれること。

🔒 ベーシック
34

例外安全と RAII

例外が飛んでも壊れない書き方。new で漏れるところを unique_ptr で塞ぎ、基本保証と強い保証を区別し、copy-and-swap でまとめて片付ける。

🔒 ベーシック
35

スマートポインタでデータ構造を作る

二分探索木を unique_ptr で書く。子は所有し、親は借りるだけ。探索・挿入・走査と、再帰デストラクタの深さの問題まで。

🔒 ベーシック
36

【実践】小さな文字列クラスを作る

Rule of Five を自分の手で書ききる。確保・コピー・ムーブ・解放を数えて動きを確かめ、最後に「それでも std::string を使う」理由を確認する。

🔒 ベーシック

Chapter 6 — モダン C++(第37〜44回)

optional・variant・string_view・span・ranges と、スレッドと排他制御を扱います。「無いかもしれない値」「どれかひとつの型」を型で表し、複数の処理を同時に走らせられるようになります。

37

std::optional

「値が無いかもしれない」を型で表す。null ポインタや -1 という約束をやめ、has_value と value_or、そして中身を取り出すときの決まり。

🔒 ベーシック
38

std::variant と std::visit

「どれかひとつの型」を安全に持つ。union との違い、index と get、visit での場合分け、そして monostate。

🔒 ベーシック
39

string_view と span

コピーせずに「見るだけ」を渡す。string_view で部分文字列を切り出す、span で配列と vector を同じ形で受け取る、そして寿命の落とし穴。

🔒 ベーシック
40

ranges の基本

begin と end を 2 つ書かなくてよくなる。std::ranges のアルゴリズム、射影(projection)、そしてビューという考え方の入口。

🔒 ベーシック
41

ranges のビューを組み合わせる

take・drop・split・join・enumerate・zip をつないで、集計を 1 本のパイプラインで書く。無限の範囲と、ビューを返してはいけない場面。

🔒 ベーシック
42

std::thread

処理を同時に走らせる。thread の作り方と join、引数の渡し方、hardware_concurrency、そして「同じ変数を触ると壊れる」ことを実測する。

🔒 ベーシック
43

mutex と排他制御

データ競合を止める。lock_guard と scoped_lock、atomic で済む場合、デッドロックの作り方と避け方、そして「共有しない」という一番強い手。

🔒 ベーシック
44

std::async と future

スレッドを直接触らずに結果を受け取る。async の launch ポリシー、future の get、例外が伝わること、promise で自分で渡す。

🔒 ベーシック

Chapter 7 — 作りきる(第45〜50回)

ヘッダ分割・CMake・ユニットテスト・サニタイザをそろえて、小さなツールを 1 本仕上げます。最後に C や Rust との違いを並べて、次にどこへ進むかの地図を渡します。

全50レッスンを終えたら、次は所有権をコンパイラが見張ってくれる Rust 入門コース や、C++ の土台になっている C 言語入門コース、ビルドしたものを配る サービス公開と運用入門コース へ。メンバーシップで全コースが解放されます。