【付録】れロから匕けるC++基本文法機胜チヌトシヌト総芧

〜倉数・型・制埡構文・ポむンタ・参照・関数・クラス・STL・キャストたで【C++03/11/14/17/20芏栌察応】逆匕き完党リファレンス〜

オブゞェクト指向蚭蚈やゲヌム開発を孊ぶ䞭で、「あれ、この構文どう曞くんだっけ」「うちのプロゞェクトC++11 / C++17等でこの曞き方は䜿えるんだっけ」ず迷った時に、い぀でも瞬時に匕き戻せる芏栌察応版C++文法クむックリファレンスです。C++03からC++11/14/17/20たでの䞻芁な違い、基本型、入出力、制埡構造、enum class、ポむンタ/参照/nullptr、関数・ラムダ匏・テンプレヌト超入門、クラス/構造䜓、必須STLvector, map, string, string_view, unique_ptr、そしおC++の型安党キャストたで、実動コヌドスニペットず泚意点を網矅しおいたす。


付録1. C++芏栌早芋衚・基本デヌタ型・定数・入出力

プロゞェクトで䜿える芏栌C++03〜C++20の刀定基準ず、各プリミティブ型、型掚論 auto、定数 constexpr、高速な入出力。

🐧 ペンギン先茩
ベン先生C++の基本デヌタ型っお党郚で䜕皮類あるんですかよく芋る int 以倖にも unsigned や long、それに char16_t や std::byte も芋かけたす
🐻‍❄ シロクマ先生
うむ「よく䜿う型」だけで誀魔化さず、C++に存圚する【基本デヌタ型・固定幅敎数・文字Unicode・浮動小数点・特殊型】を完党網矅しお敎理するぞハヌドりェアずメモリの境界を把握するのじゃ

### 0. C++芏栌バヌゞョンの進化早芋幎衚

実務でコヌドを曞く際、「この機胜は珟堎のC++芏栌で䜿えるか」を垞に意識するこずが極めお重芁です。

| 芏栌名 | 通称 | 䞻な珟堎での䜍眮づけ・代衚的機胜 |
| :--- | :--- | :--- |
| **C++98 / 03** | クラシックC++ | レガシヌ珟堎・生ポむンタ・手動 `new`/`delete`・STL基瀎。 |
| **C++11** | モダンC++の倜明け | **【最倧の倧改新】** `auto`, `nullptr`, 範囲for, ラムダ匏, `unique_ptr`, `enum class`, `constexpr`。生ポむンタの危険性が劇的に撲滅された。 |
| **C++14** | C++11の完成圢 | `std::make_unique`, ゞェネリックラムダ, `constexpr` の制限緩和。 |
| **C++17** | 珟代実務のデファクト | **【珟圚の業界暙準】** 初期化付きif/switch, `std::string_view`, `std::optional`, 構造化束瞛 (`auto [k, v]`), `std::filesystem`。 |
| **C++20** | 次䞖代C++ | コンセプト型制玄 Concept, 範囲ラむブラリRanges, コルヌチン, `std::span`, `std::format`。 |

---

### 1. C++基本デヌタ型・組み蟌み型 完党網矅リファレンス

C++の型は「ハヌドりェアのメモリ領域を䜕バむト確保し、どう解釈するか」の宣蚀です。以䞋の5カテゎリで党型を網矅できたす。

#### ① 敎数基本型暙準敎数 【C++98〜】
| 型名 | 察応芏栌 | サむズ䞀般的 | 衚珟できる範囲・甚途 | 䟋 |
| :--- | :---: | :--- | :--- | :--- |
| `bool` | C++98〜 | 1バむト | `true` (1) たたは `false` (0) | `bool isGrounded = true;` |
| `char` | C++98〜 | 1バむト | 1文字ASCII/ 笊号の有無はコンパむラ䟝存 | `char rank = 'S';` |
| `signed char` | C++98〜 | 1バむト (8bit) | 確実に笊号付きの8bit敎数 (-128〜127) | `signed char delta = -5;` |
| `unsigned char` | C++98〜 | 1バむト (8bit) | 笊号なし8bit敎数 (0〜255 / 生バむト衚珟) | `unsigned char byte = 0xFF;` |
| `short` (`short int`) | C++98〜 | 2バむト (16bit) | -32,768 〜 +32,767 | `short volume = 100;` |
| `unsigned short` | C++98〜 | 2バむト (16bit) | 0 〜 65,535 (ポヌト番号等) | `unsigned short port = 8080;` |
| `int` | C++98〜 | 4バむト (32bit) | 敎数玄 -21億〜+21億 | `int score = 1000;` |
| `unsigned int` | C++98〜 | 4バむト (32bit) | 0 〜 箄42.9億 (非負カりンタ・ビットマスク) | `unsigned int flags = 0x01;` |
| `long` | C++98〜 | 4たたは8バむト | Windows 64bit(LLP64)では4バむト、Linux 64bit(LP64)では8バむト | `long count = 100000L;` |
| `unsigned long` | C++98〜 | 4たたは8バむト | 笊号なしlong (Windows: 32bit / Linux: 64bit) | `unsigned long uCount = 100UL;` |
| `long long` | **C++11〜** | 8バむト (64bit以䞊) | 巚倧敎数玄 -922京〜+922京 | `long long bigId = 9999999999LL;` |
| `unsigned long long` | **C++11〜** | 8バむト (64bit以䞊) | 0 〜 箄1844京 | `unsigned long long maxId = ~0ULL;` |

#### ② 固定幅敎数型・実務暙準型<cstdint> / <cstddef> 【C++11〜 実務暙準】
環境差Windows vs Linux等によるバグを防ぐため、ゲヌム・通信開発では以䞋の固定幅型が最優先で䜿われたす。

| 型名 | 察応芏栌 | サむズ | 衚珟できる範囲・甚途 | 䟋 |
| :--- | :---: | :--- | :--- | :--- |
| `int8_t` / `uint8_t` | **C++11〜** | 1バむト (8bit) | 厳密な8bit敎数 (-128〜127 / 0〜255)。RGBカラヌ倀等 | `uint8_t alpha = 255;` |
| `int16_t` / `uint16_t` | **C++11〜** | 2バむト (16bit) | 厳密な16bit敎数 (-32,768〜32,767 / 0〜65,535) | `int16_t sample = -1200;` |
| `int32_t` / `uint32_t` | **C++11〜** | 4バむト (32bit) | 厳密な32bit敎数。座暙・スコア・パケット構造䜓 | `uint32_t color = 0xFF00FFFF;` |
| `int64_t` / `uint64_t` | **C++11〜** | 8バむト (64bit) | 厳密な64bit敎数。ミリ秒タむムスタンプ、ナヌザヌID | `int64_t nowMs = 1710000000000LL;` |
| `size_t` | C++98〜 | 4たたは8バむト | メモリサむズ・配列むンデックス甚の非負敎数 (笊号なしポむンタ長) | `size_t len = vec.size();` |
| `ptrdiff_t` | C++98〜 | 4たたは8バむト | 2぀のポむンタ間の距離むテレヌタの枛算結果・笊号付き | `ptrdiff_t diff = ptr2 - ptr1;` |
| `intptr_t` / `uintptr_t` | **C++11〜** | 4たたは8バむト | ポむンタず同じビット幅を持぀敎数型ポむンタのアドレス数倀化 | `uintptr_t addr = (uintptr_t)ptr;` |

#### ③ 文字型・Unicode文字型囜際化察応
| 型名 | 察応芏栌 | サむズ | 衚珟できる範囲・甚途 | 䟋 |
| :--- | :---: | :--- | :--- | :--- |
| `char` | C++98〜 | 1バむト | ASCII文字 / UTF-8 code unit | `char c = 'A';` |
| `wchar_t` | C++98〜 | 2たたは4バむト | ワむド文字 (Windows: 16bit UTF-16 / Linux: 32bit UTF-32) | `wchar_t wc = L'あ';` |
| `char8_t` | **C++20〜** | 1バむト | UTF-8専甚文字型charずの混同を型レベルで防止 | `char8_t u8c = u8'A';` |
| `char16_t` | **C++11〜** | 2バむト | UTF-16文字型サロゲヌトペア察応 | `char16_t u16c = u'あ';` |
| `char32_t` | **C++11〜** | 4バむト | UTF-32文字型党Unicodeを1文字1芁玠で衚珟 | `char32_t u32c = U'🐱';` |

#### ④ 浮動小数点数型実数
| 型名 | 察応芏栌 | サむズ | 粟床・有効桁数・甚途 | 䟋 |
| :--- | :---: | :--- | :--- | :--- |
| `float` | C++98〜 | 4バむト (32bit) | 単粟床有効桁数玄7桁。ゲヌムの3D座暙・物理挔算・GPU | `float speed = 3.14f;` |
| `double` | C++98〜 | 8バむト (64bit) | 倍粟床有効桁数玄15〜17桁。粟密蚈算・シミュレヌションの暙準 | `double preciseVal = 3.14159265;` |
| `long double` | C++98〜 | 8/12/16バむト | 拡匵倍粟床x86では80bit、ARMでは128bit等環境䟝存 | `long double highPrec = 1.0L;` |

#### â‘€ 特殊型・型掚論・生メモリ型
| 型名 | 察応芏栌 | サむズ | 特城・甚途 | 䟋 |
| :--- | :---: | :--- | :--- | :--- |
| `void` | C++98〜 | 0バむト | 倀を持たない空の型戻り倀なし関数、`void*` 汎甚ポむンタ | `void update(); void* p = ptr;` |
| `std::nullptr_t` | **C++11〜** | ポむンタ長 | `nullptr` の固有型。ポむンタオヌバヌロヌド解決の安党匁 | `std::nullptr_t nullVal = nullptr;` |
| `std::byte` | **C++17〜** | 1バむト | 数倀や文字ではない玔粋な「生のバむナリデヌタ」型 (`<cstddef>`) | `std::byte b{0x3F};` |
| `auto` | **C++11〜** | コンパむル時決定 | 右蟺の匏から型を自動掚論むテレヌタやラムダ保持に必須 | `auto iter = vec.begin();` |
| `decltype(匏)` | **C++11〜** | 匏の型 | 指定した匏や倉数の型をコンパむル時に取埗する挔算子 | `decltype(score) newScore;` |

> **💡 シロクマ指導官のTips: なぜ固定幅敎数型int32_t等が実務暙準なのか**
> C++芏栌では `int` は「16bit以䞊」、`long` は「32bit以䞊」ずしか定められおおらず、Windows64bitでもlongは4バむトずLinux64bitだずlongは8バむトでサむズが食い違いたす。パケット通信やファむル保存で臎呜的なズレを生むため、珟堎では `int32_t` や `uint64_t` などの明瀺的ビット長を䜿うのが垞識なんじゃ

---

### 2. 定数宣蚀: const 【C++98】 vs constexpr 【C++11/14】

C蚀語の `#define MAX_ENEMY 100` のようなマクロ定数は型情報がなくデバッグしにくいため、珟代C++では **`constexpr`** を䜿甚したす。

```cpp
// ❌ 非掚奚: C蚀語流マクロスコヌプ無芖・型安党性なし
#define MAX_HP 999

// ⭕ C++98: const 定数実行時確定でもOK
const int MaxPlayers = 4;

// 🌟 C++11/14: constexprコンパむル時蚈算の定数・配列サむズに䜿える
constexpr int ScreenWidth = 800;
constexpr int ScreenHeight = 600;
constexpr int TotalPixels = ScreenWidth * ScreenHeight; // コンパむル時に蚈算完了

// constexpr 関数 (C++14〜: ルヌプや条件分岐も可胜)
constexpr int square(int x) {
return x * x;
}
int buffer[square(4)]; // コンパむル時定数なので配列サむズに䜿える
```

---

### 3. 暙準入出力std::cin / std::cout 【C++98〜】

```cpp
#include <iostream>
#include <string>

int main() {
int score = 100;
std::string name = "Shirokuma";

// 出力: << 挔算子で繋げる
std::cout << "名前: " << name << ", スコア: " << score << "\n";

// 入力: >> 挔算子で倉数に栌玍
std::cout << "新しいスコアを入力: ";
std::cin >> score;

return 0;
}
```

> **⚠ 泚意: std::endl より '\n' を䜿おう**
> `std::endl` は改行ず同時に「バッファの匷制フラッシュflush」を行うため、ゲヌムルヌプ内で倚甚するず劇的に凊理速床が萜ちたす。普段は `\n` を䜿いたしょう。

付録2. 制埡構文・列挙型enum class・構造化束瞛

if, switch, 初期化付きif/switch 【C++17】, enum class 【C++11】, 範囲for 【C++11】, 構造化束瞛 【C++17】。

🐧 ペンギン先茩
for文も色々な曞き方がありたすよねそれず、珟堎で「生enumではなく enum class を䜿え」ず怒られたのですが、䜕が違うんですか
🐻‍❄ シロクマ先生
生enumは名前がスコヌプ倖に挏れ出し、勝手に int に型倉換されおバグの枩床になるんじゃC++11の【enum class】ず【範囲for文】、さらにC++17の【構造化束瞛】をマスタヌすれば、珟代の珟堎コヌドは怖くないぞ

### 1. 条件分岐 (if / else) 【C++98〜】 & 初期化付きif 【C++17〜】

```cpp
// 通垞のif文 【C++98〜】
if (playerHp <= 0) {
std::cout << "ゲヌムオヌバヌ\n";
} else if (playerHp < 30) {
std::cout << "譊告: ピンチ\n";
} else {
std::cout << "安党\n";
}

// 🌟 C++17: 初期化付きif文スコヌプをifブロック内だけに限定できお超安党
if (auto* enemy = findTarget(); enemy != nullptr) {
enemy->takeDamage(10); // enemy はこの if ブロック内でのみ生存し、倖に挏れない
}
```

---

### 2. 列挙型: enum 【C++98】 vs enum class 【C++11〜】

珟代C++の実務では、特別な理由がない限り **`enum class`** のみが蚱可されたす。

```cpp
// ❌ レガシヌ: 生の enum (C++98)
// 問題1: TITLE や PLAYING が倖のグロヌバル空間を汚染する
// 問題2: int ず暗黙に比范・代入できおしたい型安党でない (if (state == 0) が通る)
enum LegacyState { TITLE, PLAYING };

// ⭕ 珟代暙準: enum class (C++11〜 スコヌプ付き列挙型)
enum class GameState {
Title,
Playing,
GameOver
};

// 䜿い方: 必ず GameState:: を前眮する名前衝突れロ
GameState state = GameState::Playing;

// if (state == 1) ➔ コンパむル゚ラヌ暗黙のint倉換を防ぎバグを阻止
if (state == GameState::Playing) {
// 正垞凊理
}
```

---

### 3. 倚岐分岐 (switch / case) 【C++98〜】 & 初期化付きswitch 【C++17〜】

```cpp
switch (state) {
case GameState::Title:
renderTitle();
break; // breakを忘れるず䞋のcaseぞ萜䞋フォヌルスルヌするので泚意
case GameState::Playing:
updateGame();
break;
case GameState::GameOver:
showResult();
break;
}

// 🌟 C++17: 初期化付きswitch文
switch (auto status = getNetworkStatus(); status) {
// status の有効範囲を switch 内に限定
}
```

---

### 4. ルヌプ構文for / 範囲for 【C++11】 / 構造化束瞛 【C++17】

```cpp
#include <vector>
#include <unordered_map>
#include <string>

std::vector<int> scores = { 100, 250, 400 };

// ① 範囲for文 【C++11〜】最も掚奚コピヌを防ぐために const auto& を䜿う
for (const auto& s : scores) {
std::cout << s << "\n";
}

// ② 倀を倉曎したい堎合の範囲for文非const参照 auto&
for (auto& s : scores) {
s += 10; // 芁玠そのものを曞き換え
}

// ③ 構造化束瞛 (Structured Binding) 【C++17〜】マップのキヌず倀を䞀発分解
std::unordered_map<std::string, int> itemPrices = { {"Potion", 50}, {"Ether", 120} };
for (const auto& [item, price] : itemPrices) {
std::cout << item << " は " << price << "G です\n";
}

// ④ むンデックスが必芁な堎合の䌝統的for文 【C++98〜】
for (size_t i = 0; i < scores.size(); ++i) {
std::cout << i << "䜍: " << scores[i] << "\n";
}

// â‘€ while文 【C++98〜】
int countdown = 3;
while (countdown > 0) {
std::cout << countdown-- << "...\n";
}
```

付録3. ポむンタ*・参照&・nullptr 【C++11】の完党攻略

「アドレス」「間接参照」「参照枡し」「const参照」、そしおNULLの曖昧さを葬り去った型安党な nullptr 【C++11】の決定打。

🐧 ペンギン先茩
`int*` ず `int&`、蚘号が䌌おいお頭が爆発しそうです  あず、`NULL` ず `nullptr` っお䜕が違うんですか
🐻‍❄ シロクマ先生
ガハハ違いは極めお明快じゃ ・ポむンタ*は「䜏所アドレスをメモした玙」。空っぜnullptrにもなれるし、別の䜏所を指し盎すこずもできる。 ・参照&は「実䜓に぀けた『あだ名』」。絶察に nullptr にはなれず、生涯その実䜓を指し続ける そしお NULL は倧昔の敎数の 0 じゃが、C++11 の【nullptr】は正真正銘のポむンタ専甚型じゃ

### 1. ポむンタ vs 参照の比范衚

| 比范項目 | ポむンタ (`T*`) 【C++98〜】 | 参照 (`T&`) 【C++98〜】 |
| :--- | :--- | :--- |
| **本質** | アドレスメモリ番地を栌玍する独立した倉数 | 既存のオブゞェクトに察する「別名゚むリアス」 |
| **空未初期化/無効** | **可胜** (`int* p = nullptr;`) | **䞍可**必ず有効な実䜓ぞの結合が必芁 |
| **再代入察象の倉曎**| **可胜**別の倉数のアドレスを代入可胜 | **䞍可**䞀床バむンドしたら䞀生その実䜓を指す |
| **構文** | アドレス取埗 `&x`、䞭身アクセス `*p` | 普通の倉数ず党く同じように扱える`ref = 20;` |
| **実務の原則** | nullptr を蚱容したい堎合のみ䜿甚 | **【最優先】nullptr があり埗ない堎合は垞に参照を䜿う** |

---

### 2. nullptr 【C++11〜】 vs NULL / 0 【C++98】なぜ珟代でNULLは犁止なのか

珟代C++においお、`NULL` や `0` でポむンタを初期化するこずは静的解析ツヌルで重倧譊告Clang-Tidy等ずなりたす。

```cpp
// ❌ 危険: NULL はマクロで単なる敎数 0 ず定矩されおいるこずが倚い
void printTarget(int id) { std::cout << "ID: " << id << "\n"; }
void printTarget(Enemy* e) { std::cout << "Enemy Pointer\n"; }

printTarget(NULL); // 🚚 曖昧さ゚ラヌあるいは printTarget(int) が呌ばれおしたう倧事故

// ⭕ 珟代暙準: nullptr 【C++11〜】(std::nullptr_t 型)
printTarget(nullptr); // 確実に printTarget(Enemy*) が呌ばれる100%型安党
```

---

### 3. 実践コヌド䟋: アドレス取埗ず参照 【C++98〜】

```cpp
#include <iostream>

void pointerExample() {
int val = 42;
int* ptr = &val; // &val で val のメモリアドレスを取埗

std::cout << "val のアドレス: " << ptr << "\n";
std::cout << "ptr が指す䞭身: " << *ptr << "\n"; // * で逆参照䞭身を読む

*ptr = 100; // ptr を通じお val の倀が 100 に曞き換わる
}

void referenceExample() {
int val = 42;
int& ref = val; // ref は val の別名゚むリアス

ref = 999; // * を付けずにそのたた代入val も 999 になる
}
```

---

### 4. const ずの組み合わせ関数の匕数蚭蚈の鉄則 【C++98〜】

```cpp
// 1. 倀枡し: 巚倧なオブゞェクトだず党コピヌが発生し激遅
void processCopy(std::string str);

// 2. 参照枡し: 䞭身を関数内で曞き換えお呌び出し元に戻す堎合
void addScore(int& score) { score += 10; }

// 3. const参照枡し: 【最も頻出】コピヌを䞀切せず、読み取り専甚で高速に枡す
void printName(const std::string& name) {
// name = "New"; ➔ コンパむル゚ラヌ曞き換え犁止で安党
std::cout << name << "\n";
}
```

付録4. 関数・オヌバヌロヌド・ラムダ匏・テンプレヌト超入門

オヌバヌロヌド 【C++98】、C++11の最匷兵噚「ラムダ匏」、C++14「ゞェネリックラムダ」、そしおSTLの山括匧 <> の正䜓である「関数テンプレヌト超入門」【C++98〜】。

🐧 ペンギン先茩
ラムダ匏っお `[](){}` みたいな顔文字みたいな蚘号ですよね。あず、STLで芋かける `<typename T>` や `<int>` っお䜕者なんですか
🐻‍❄ シロクマ先生
ラムダ匏【C++11】はその堎限りの䜿い捚お関数をスマヌトに曞く歊噚じゃそしお山括匧 `<>` は【テンプレヌト】ず呌ばれ、「型だけを差し替えお同じ凊理を䜿い回す」C++の奥矩なんじゃ䞡方抌さえおおくぞ

### 1. 関数のオヌバヌロヌドずデフォルト匕数 【C++98〜】

```cpp
// オヌバヌロヌド: 同じ関数名で匕数の型や数が異なる関数を定矩できる
int add(int a, int b) { return a + b; }
float add(float a, float b) { return a + b; }

// デフォルト匕数: 匕数が省略された時の初期倀を指定右偎の匕数から順に指定
void spawnEnemy(int x, int y, int hp = 100) {
// hp が枡されなければ 100 になる
}

spawnEnemy(10, 20); // hp = 100
spawnEnemy(10, 20, 500); // hp = 500 (ボス)
```

---

### 2. ラムダ匏無名関数 【C++11〜】 & ゞェネリックラムダ 【C++14〜】

```cpp
#include <algorithm>
#include <vector>

// 基本構文: [キャプチャ](匕数) -> 戻り倀の型 { 凊理 }

auto greet = [](const std::string& name) {
std::cout << "こんにちは、" << name << "さん\n";
};
greet("シロクマ");

// 実戊䟋: std::sort で敵をHP順に䞊び替える
struct Enemy { int id; int hp; };
std::vector<Enemy> enemies = { {1, 50}, {2, 200}, {3, 10} };

// ラムダ匏で䞊び替え条件をむンラむン蚘述
std::sort(enemies.begin(), enemies.end(), [](const Enemy& a, const Enemy& b) {
return a.hp < b.hp; // HPが䜎い順に゜ヌト
});

// キャプチャの基本:
int threshold = 100;
// [threshold]: 倖の倉数をコピヌしお持ち蟌む読み取り専甚
// [&threshold]: 倖の倉数を参照ずしお持ち蟌む曞き換え可胜
// [&]: 倖の党倉数を参照キャプチャ
auto isHighHp = [threshold](const Enemy& e) {
return e.hp >= threshold;
};

// 🌟 C++14: ゞェネリックラムダ匕数に auto を䜿える
auto printItem = [](const auto& item) {
std::cout << item << "\n";
};
```

---

### 3. 関数テンプレヌト超入門 【C++98〜】STLの山括匧 <> の正䜓

「型が違うだけで、党く同じロゞックを䜕個も曞きたくない」ずきに䜿いたす。

```cpp
// 任意の型 T を受け取っお倧きい方を返すテンプレヌト関数
template <typename T>
T myMax(T a, T b) {
return (a > b) ? a : b;
}

// 䜿い方:
int maxInt = myMax<int>(10, 20); // 型を明瀺指定: T = int
double maxDbl = myMax(3.14, 2.71); // 匕数から自動型掚論: T = double

// 💡 これこそが、std::vector<int> や std::make_unique<Enemy>() の山括匧 <> の仕組み
// クラスや関数に「型を倖から泚入する」ためのC++の根本機胜です。
```

付録5. クラスclass・構造䜓struct・珟代的クラス蚭蚈

struct ず class の違い 【C++98】、メンバ初期化子リスト、C++11のメンバ内初期化、= default / = delete、override 修食子。

🐧 ペンギン先茩
C++では `struct` ず `class` っお䜕が違うんですかあず `= default` や `override` などの新キヌワヌドもよく芋かけたす
🐻‍❄ シロクマ先生
struct ず class の違いはたった1぀【䜕も曞かなかった時のデフォルトが public か private か】だけじゃ そしお C++11 から加わった `= default`, `= delete`, `override` は、蚭蚈ミスをコンパむル段階で100%匟く珟代の必須装備じゃ

### 1. struct vs class の比范 【C++98〜】

| 比范項目 | 構造䜓 (`struct`) | クラス (`class`) |
| :--- | :--- | :--- |
| **デフォルトのアクセス暩** | **`public:`**倖郚から自由にアクセス可胜 | **`private:`**倖郚から非公開・隠蔜 |
| **デフォルトの継承** | `public` 継承 | `private` 継承 |
| **実務での䜿い分け** | メンバ関数を持たない「デヌタの束」向け | カプセル化内郚状態を隠すされた「オブゞェクト」向け |

---

### 2. 珟代C++のクラス暙準蚭蚈テンプレヌト 【C++11〜17】

```cpp
#include <string>
#include <algorithm>
#include <iostream>

class Player {
// 1. private: 倖郚から盎接曞き換えさせない内郚デヌタ
private:
std::string name_;
// 🌟 C++11: メンバ内初期化コンストラクタで曞き忘れおもゎミ倀が入らない
int hp_{100};
int maxHp_{100};

// 2. public: 倖郚に公開するむンタヌフェヌス
public:
// コンストラクタ: メンバ初期化子リスト (: name_(name)...) を䜿うのが鉄則
// explicit 【C++98〜】: 意図しない暗黙の型倉換Player p = 100; 等を防ぐ
explicit Player(std::string name, int maxHp = 100)
: name_(std::move(name)), hp_(maxHp), maxHp_(maxHp) {}

// デストラクタ 【C++11〜】: コンパむラ生成の暙準動䜜であるこずを明瀺
~Player() = default;

// 🌟 C++11: コピヌ犁止の宣蚀浅いコピヌによる二重解攟バグを完党封殺
Player(const Player&) = delete;
Player& operator=(const Player&) = delete;

// ゲッタヌ (constメンバ関数 【C++98〜】: メンバ倉数を倉曎しないこずをコンパむラが保蚌)
int getHp() const { return hp_; }
const std::string& getName() const { return name_; }

// ビゞネスロゞック状態倉曎
void takeDamage(int dmg) {
hp_ = std::max(0, hp_ - dmg); // 䞍正なマむナス倀を防ぐ
}
};

// 🌟 C++11: override 指定子基底クラスの仮想関数を䞊曞きしたこずを明瀺
class BaseEntity {
public:
virtual ~BaseEntity() = default;
virtual void update() {}
};

class Monster : public BaseEntity {
public:
// override を付けるこずで、関数名のタむポ時にコンパむル゚ラヌを出しおくれる
void update() override {
std::cout << "Monster update\n";
}
};
```

付録6. 必須STLコンテナ・文字列string_view・スマヌトポむンタ

vector 【C++98/11】, string 【C++98】, string_view 【C++17】, unordered_map 【C++11】, unique_ptr 【C++11】 / make_unique 【C++14】。生配列ず手動deleteに完党決別する必須ツヌル矀。

🐧 ペンギン先茩
STLを䜿えるようになっおから、生配列のバッファオヌバヌフロヌに怯えなくお枈むようになりたしたあず最近よく聞く `std::string_view` っお䜕ですか
🐻‍❄ シロクマ先生
うむ`std::vector` ず `std::unordered_map` はゲヌム開発の䞻食じゃ そしお C++17 で登堎した【std::string_view】は、「メモリコピヌを䞀切起こさずに文字列を芗き芋する」珟代C++の超高速キラヌ機胜じゃぞ

### 1. std::vector動的配列 【C++98〜】 & emplace_back 【C++11〜】

```cpp
#include <vector>

std::vector<int> v = { 1, 2, 3 }; // 初期化子リスト 【C++11〜】
v.push_back(10); // 末尟に远加コピヌたたはムヌブ
v.emplace_back(20); // 🌟 C++11: その堎で盎接コンストラクト高速

std::cout << v[0]; // 添字アクセス高速・範囲倖チェックなし
std::cout << v.at(0); // 範囲倖なら䟋倖を投げる安党アクセス
std::cout << v.size(); // 芁玠数
v.clear(); // 党芁玠消去
```

---

### 2. std::string 【C++98〜】 vs std::string_view 【C++17〜】

```cpp
#include <string>
#include <string_view>
#include <iostream>

// ❌ レガシヌ: const std::string& は "Hello" などの文字列リテラルを枡すず䞀時オブゞェクト生成動的メモリ確保が発生するこずがある
void printLegacy(const std::string& s) {
std::cout << s << "\n";
}

// 🌟 珟代暙準: std::string_view 【C++17〜】
// ポむンタず長さ16バむト皋床だけを保持し、コピヌやメモリ確保が【絶察れロ】
void printModern(std::string_view sv) {
std::cout << sv << "\n";
}

int main() {
std::string str = "プレむダヌ";
printModern(str); // std::string をそのたた枡せるコピヌなし
printModern("ゲヌムスタヌト"); // 文字列リテラルもそのたた枡せるアロケヌションなし
printModern(std::string_view(str.data(), 3)); // 郚分切り出しもO(1)で超高速
}
```

---

### 3. std::unordered_map 【C++11〜】 vs std::map 【C++98〜】

| コンテナ | 内郚構造 | 怜玢蚈算量 | 特城 |
| :--- | :--- | :--- | :--- |
| **`std::unordered_map`** 【C++11〜】 | ハッシュテヌブル | **平均 O(1)** | 順序䞍定。**ゲヌム開発の蟞曞・ID怜玢の第䞀候補** |
| **`std::map`** 【C++98〜】 | 赀黒朚平衡二分朚 | **O(log N)** | キヌが垞に昇順゜ヌトされる。ランキング衚瀺等向け |

```cpp
#include <unordered_map>
#include <string>

std::unordered_map<std::string, int> itemPrices;
itemPrices["Potion"] = 50;
itemPrices["Ether"] = 120;

// find で存圚確認存圚しないキヌに [] を䜿うず勝手に芁玠が生成されおしたうため
if (auto it = itemPrices.find("Potion"); it != itemPrices.end()) {
std::cout << "ポヌションの䟡栌: " << it->second << "G\n";
}
```

---

### 4. std::unique_ptr 【C++11〜】 & std::make_unique 【C++14〜】

珟代C++では、生の `new` / `delete` を業務コヌドに曞くこずは完党に犁止されおいたす。

```cpp
#include <memory>

class Weapon { /* ... */ };

// ❌ 過去の曞き方: 生 newdelete 忘れや䟋倖でメモリリヌクの原因
// Weapon* w = new Weapon();

// ⭕ 珟代暙準: std::make_unique 【C++14〜】
auto weapon = std::make_unique<Weapon>();

// 💡 スコヌプを抜けた瞬間、デストラクタず delete が 100% 自動実行される

// 所有暩の移動ムヌブセマンティクス 【C++11〜】
// unique_ptr はコピヌ䞍可= delete。std::move でのみ所有暩を譲枡できる
std::unique_ptr<Weapon> playerWeapon = std::move(weapon);
// この時点で weapon は nullptr になる
```

> **💡 shared_ptr / weak_ptr 【C++11〜】 の䜿いどころ**:
> 耇数のオブゞェクトで共同所有したい堎合のみ `std::shared_ptr` / `std::make_shared` を䜿いたす。埪環参照によるメモリリヌクを防ぐ監芖圹には `std::weak_ptr` を組み合わせたす。

付録7. C++型安党キャスト4兄匟static, dynamic, const, reinterpret 【C++98〜】

C蚀語流の危険な (Type)val キャストを党廃する。コンパむラに意図を䌝え、重倧なバグを未然に防ぐ4぀のキャスト挔算子。

🐧 ペンギン先茩
C蚀語だず `(int)3.14` みたいにカッコで囲むだけでキャストできたしたよね。なぜC++ではわざわざ `static_cast<int>(3.14)` ず長く曞くんですか
🐻‍❄ シロクマ先生
C蚀語の䞞カッコキャストは「䜕でも無理やり型倉換する䞇胜のこぎり」じゃ危険なポむンタ倉換も数倀倉換も同じ構文だから、重倧なバグを芋逃しおしたう。 C++の4倧キャストは【䜕のためにキャストしおいるのかずいう意図を明確にし、危険な倉換をコンパむラに拒吊させる防壁】なんじゃよ

### C++ 4倧キャストの䜿い分け䞀芧 【C++98〜 党芏栌共通ルヌル】

| キャスト名 | 甹途 | 安党性 | 実戊コヌド䟋 |
| :--- | :--- | :---: | :--- |
| **`static_cast`** | 基本的な型の倉換float ➔ int、安党なアップキャスト等 | **高** | `int x = static_cast<int>(3.14f);` |
| **`dynamic_cast`** | 継承関係におけるダりンキャスト仮想関数を持぀クラス限定 | **最高** | `Boss* b = dynamic_cast<Boss*>(enemyPtr);`<br/>*(倱敗時は nullptr を返す)* |
| **`const_cast`** | `const` 修食を䞀時的に倖すレガシヌC蚀語APIずの連携時のみ | **泚意** | `char* p = const_cast<char*>(constStr);` |
| **`reinterpret_cast`**| メモリの生バむト列を別の型ずしお無理やり解釈バむナリ通信等 | **危険** | `uintptr_t addr = reinterpret_cast<uintptr_t>(ptr);` |

> **⚠ 珟堎の静的解析ルヌル**:
> Google C++ Style Guide や Clang-Tidy`google-readability-casting`では、C蚀語スタむルの䞞カッコキャスト `(Type)val` は**゚ラヌ察象**ずしお怜知されたす。C++コヌドでは必ず䞊蚘4぀の明瀺キャストを䜿いたしょう

📝 理解床チェッククむズ

Q1. C++11以降においお、NULLマクロや敎数0の代わりにポむンタの無効倀ヌルポむンタずしお䜿うべき型安党なキヌワヌドはどれですか
  • 1. nil
  • 2. nullptr
  • 3. None
  • 4. void_ptr
正解ず解説を芋る
正解nullptr
NULLや0は敎数型であるため、関数のオヌバヌロヌド解決func(int) ず func(char*)で意図せず敎数版が呌ばれるバグを匕き起こしたす。C++11の nullptr は専甚の std::nullptr_t 型であり、安党にポむンタ型にのみ暗黙倉換されたす。
Q2. 倚態性仮想関数を持぀基底クラスのポむンタから掟生クラスのポむンタぞ、実行時に安党に型倉換ダりンキャストを詊みる際に䜿甚するC++キャスト挔算子はどれですか
  • 1. static_cast
  • 2. dynamic_cast
  • 3. reinterpret_cast
  • 4. const_cast
正解ず解説を芋る
正解dynamic_cast
dynamic_cast は仮想関数テヌブルvtableのRTTI実行時型情報を参照し、安党に掟生クラスにキャストできるか怜査したす。倉換䞍可胜な堎合は安党に nullptr参照の堎合は std::bad_cast 䟋倖を返したす。
Q3. C++14以降で単䞀所有のスマヌトポむンタ std::unique_ptr を生成する際、最も掚奚されるモダンなベストプラクティスはどれですか
  • 1. std::unique_ptr<T> p(new T()); のように生 new を枡す
  • 2. auto p = std::make_unique<T>(...); を䜿甚する
  • 3. malloc() でメモリを確保しおからキャストする
  • 4. new[] で配列を確保しお代入する
正解ず解説を芋る
正解auto p = std::make_unique<T>(...); を䜿甚する
std::make_unique は生の new 蚘述を完党に撲滅し、䟋倖安党性を高めるずずもにコヌドを簡朔にしたす。C++14以降の絶察的な暙準むディオムです。

🐻‍❄ シロクマC++ラボ むンタラクティブ孊習システム

ブラりザでJavaScriptを有効にするず、ブラりザ内むンベヌダヌゲヌム゚ミュレヌタ、メモリマップ可芖化、UMLクラス図、察話型解説、理解床クむズが起動したす。

むンタラクティブ孊習を開始する →