C++ チートシート
最終更新
Hello World とプログラムの構造
実行は int を返す main から始まります。
| 要素 | コード |
|---|---|
| ヘッダーをインクルード | #include <iostream> |
| エントリポイント | int main() { ... } |
| 1 行を出力 | std::cout << "Hello, World!" << std::endl; |
| 入力を読み取る | std::cin >> x; |
| std 名前空間を使う | using namespace std; |
| 成功を返す | return 0; |
| コメント | // line と /* block */ |
データ型
| 型 | 説明 |
|---|---|
int | 整数 (通常 32 ビット) |
long / long long | より幅の広い整数 |
float / double | 浮動小数点数 |
char | 1 バイト / 文字 |
bool | true または false |
std::string | <string> の動的なテキスト |
auto | コンパイラが型を推論 |
std::size_t | サイズやインデックス用の符号なし型 |
変数と参照
参照は別名、ポインタはアドレスを保持します。
| 操作 | 構文 |
|---|---|
| 宣言と初期化 | int x = 5; |
| 波かっこ初期化 | int x{5}; |
| 定数 | const double PI = 3.14159; |
| コンパイル時定数 | constexpr int N = 10; |
| 参照 (別名) | int &r = x; |
| ポインタ | int *p = &x; |
| ポインタの間接参照 | *p = 10; |
| 型推論 | auto y = 3.14; |
制御フロー
| 文 | 構文 |
|---|---|
| if / else | if (x > 0) { ... } else { ... } |
| switch | switch (n) { case 1: ...; break; default: ...; } |
| while ループ | while (i < n) { ... } |
| do-while ループ | do { ... } while (i < n); |
| for ループ | for (int i = 0; i < n; i++) { ... } |
| 範囲 for | for (auto x : vec) { ... } |
| 参照による範囲 for | for (auto &x : vec) { ... } |
| break / continue | break; はループを抜け、continue; は次の反復へ進む |
関数
| 操作 | 構文 |
|---|---|
| 関数を定義 | int add(int a, int b) { return a + b; } |
| 戻り値なし | void greet() { ... } |
| デフォルト引数 | int pow(int b, int e = 2) { ... } |
| 参照渡し | void inc(int &x) { x++; } |
| const 参照 (コピーなし) | void print(const std::string &s) { ... } |
| オーバーロード | int max(int a, int b); と double max(double a, double b); |
| ラムダ | auto f = [](int x) { return x * 2; }; |
| キャプチャ付きラムダ | auto g = [n](int x) { return x + n; }; |
クラスとオブジェクト指向
| 操作 | 構文 |
|---|---|
| クラスを定義 | class Dog { ... }; |
| アクセス指定子 | public:, private:, protected: |
| メンバ変数 | std::string name; |
| コンストラクタ | Dog(std::string n) : name(n) {} |
| デストラクタ | ~Dog() { ... } |
| メンバ関数 | void bark() { ... } |
| オブジェクトを生成 | Dog d("Rex"); |
| 継承 | class Puppy : public Dog { ... }; |
| 仮想関数 | virtual void speak(); |
STL コンテナ
標準ライブラリのよく使うコンテナ。
| コンテナ | 用途と例 |
|---|---|
std::vector<int> | 動的配列: v.push_back(1); v.size(); |
std::string | テキスト: s += "!"; s.length(); |
std::array<int, 3> | サイズ情報を持つ固定長配列 |
std::map<K, V> | ソートされたキーと値: m["a"] = 1; |
std::unordered_map<K, V> | ハッシュマップ (検索が速い、順序なし) |
std::set<T> | ソートされた一意な値: s.insert(5); |
std::pair<A, B> | 2 つの値: make_pair(1, "x") |
std::queue / std::stack | FIFO のキュー / LIFO のスタックアダプタ |
STL のアルゴリズムとイテレータ
<algorithm> のもの。多くは begin/end のイテレータ範囲を取ります。
| 操作 | 構文 |
|---|---|
| begin / end イテレータ | v.begin(), v.end() |
| ソート | std::sort(v.begin(), v.end()); |
| 降順でソート | std::sort(v.begin(), v.end(), std::greater<int>()); |
| 値を探す | auto it = std::find(v.begin(), v.end(), 5); |
| 一致を数える | std::count(v.begin(), v.end(), 5); |
| 最小 / 最大の要素 | std::max_element(v.begin(), v.end()); |
| 範囲の合計 | std::accumulate(v.begin(), v.end(), 0); |
| 各要素を変換 | std::transform(v.begin(), v.end(), v.begin(), fn); |
スマートポインタとモダン C++
自動的な後始末のため、生の new/delete よりスマートポインタを優先します。
| 機能 | 構文 |
|---|---|
| 唯一の所有権 | auto p = std::make_unique<Dog>("Rex"); |
| 共有の所有権 | auto p = std::make_shared<Dog>("Rex"); |
| 所有しない参照 | std::weak_ptr<Dog> w = p; |
| ムーブセマンティクス | auto v2 = std::move(v1); |
| nullptr | int *p = nullptr; |
| 構造化束縛 | auto [key, val] = *it; |
| オプショナルな値 | std::optional<int> maybe; |
| テンプレート | template <typename T> T add(T a, T b) { return a + b; } |
最もよく使う C++ の構文、STL コンテナ、モダンな機能を 1 ページにまとめました。この C++ チートシートは、C++ を書くためのクイックリファレンスです。データ型、参照、クラス、標準ライブラリのコンテナとアルゴリズム、そして生の new/delete を置き換えるスマートポインタを収録しています。
ここに載っているものはすべて標準の C++ (C++11 以降) で、g++ または clang++ でコンパイルできます。必要なものをコピーするか、C++ プレイグラウンドでどのスニペットもその場で試してみてください。コンパイラのインストールは不要です。
C++ チートシート よくある質問
この C++ チートシートは無料ですか?
はい。この C++ チートシートは完全に無料で、登録も不要です。ブックマークしておけば、構文や STL コンテナ、スマートポインタを調べたいときにいつでも戻ってこられます。
C++ のポインタと参照の違いは何ですか?
ポインタはアドレスを保持する変数で、null になり得て、別の場所を指すよう再代入でき、
*p で間接参照します。参照 (int &r = x) は既存の変数の別名で、宣言時に束縛する必要があり、null になることも別の対象に束縛し直すこともできず、その変数そのもののように使います。引数の参照渡しをすっきり書くには参照を、オプショナルだったり再代入できる間接参照が必要なときはポインタを使いましょう。new/delete とスマートポインタのどちらを使うべきですか?
スマートポインタを優先しましょう。
std::unique_ptr と std::shared_ptr (make_unique/make_shared 経由) はスコープを抜けるときに自動でメモリを解放するため、手動の new/delete につきものの漏れや二重解放を防げます。生の new/delete は、特定の理由がある低レベルなコードでだけ使いましょう。C++ をオンラインで練習できますか?
はい。C++ プレイグラウンドを開けば、このチートシートのどのスニペットも、ブラウザ上でコンパイルして実行できます。コンパイラのインストールは不要です。体系的に学びたいときは、Coddy の無料インタラクティブ C++ コースが、変数とループからクラス、STL まで段階的に導いてくれます。
このチートシートは初心者に向いていますか?
はい。最もよく使う構成要素 (型、制御フロー、関数) から高度なもの (STL とスマートポインタ) へと並べてあるので、初日から上のセクションを使い、残りには慣れながら進めます。