Menu
Coddy logo textTech

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浮動小数点数
char1 バイト / 文字
booltrue または 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 / elseif (x > 0) { ... } else { ... }
switchswitch (n) { case 1: ...; break; default: ...; }
while ループwhile (i < n) { ... }
do-while ループdo { ... } while (i < n);
for ループfor (int i = 0; i < n; i++) { ... }
範囲 forfor (auto x : vec) { ... }
参照による範囲 forfor (auto &x : vec) { ... }
break / continuebreak; はループを抜け、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::stackFIFO のキュー / 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);
nullptrint *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_ptrstd::shared_ptr (make_unique/make_shared 経由) はスコープを抜けるときに自動でメモリを解放するため、手動の new/delete につきものの漏れや二重解放を防げます。生の new/delete は、特定の理由がある低レベルなコードでだけ使いましょう。
C++ をオンラインで練習できますか?
はい。C++ プレイグラウンドを開けば、このチートシートのどのスニペットも、ブラウザ上でコンパイルして実行できます。コンパイラのインストールは不要です。体系的に学びたいときは、Coddy の無料インタラクティブ C++ コースが、変数とループからクラス、STL まで段階的に導いてくれます。
このチートシートは初心者に向いていますか?
はい。最もよく使う構成要素 (型、制御フロー、関数) から高度なもの (STL とスマートポインタ) へと並べてあるので、初日から上のセクションを使い、残りには慣れながら進めます。
Coddy programming languages illustration

CoddyでC++を学ぼう

始める