C++: C++を知る
10人のプログラマーに「最も難しいプログラミング言語は何か」と聞けば、少なくとも5人はC++と答えるでしょう。しかし、「最も高速で、最も制御可能なシステムレベルの言語は何か」と聞けば、10人全員がC++と答えます。このレッスンではコードを書きません——C++について知ることに集中します。C++とは何か、どこから来たのか、何ができるのか、学ぶ価値があるのか。
1. C++とは何か?
C++はコンパイル型、静的型付け、マルチパラダイムのプログラミング言語です。簡単に言うと:
- コンパイル型 — ソースコードを実行前に機械語にコンパイルする必要がある(料理のように:準備してから調理する)
- 静的型付け — すべての変数の型はコンパイル時に決定される(フォームに記入するように:各フィールドには指定された型がある)
- マルチパラダイム — 手続き型、オブジェクト指向、ジェネリックプログラミングをサポート(レンチ、ドライバー、ドリルが入った道具箱のようなもの)
(1) C++とCの関係
C++はCの「強化版アップグレード」です。1983年、デンマークのプログラマーBjarne StroustrupがCにクラスを追加し、オブジェクト指向プログラミングを言語にもたらしました。
2. なぜC++を学ぶのか?
| 理由 | 説明 |
|---|---|
| 最高のパフォーマンス | C++はハードウェア上で直接実行される機械語にコンパイルされる——VMもインタプリタもガベージコレクションもない。超高速だ。 |
| 比類なき制御力 | メモリ割り当て、CPUキャッシュの使用、ポインター操作——すべて自分で制御できる。 |
| 幅広いキャリアの機会 | ゲームエンジン、高頻度トレーディング、組込みシステム、自動運転、オペレーティングシステム——C++がこれらの分野を支配している。 |
| 確かな基盤 | C++を学べば、他の言語(Java、Python、Go)の「内部的な」ロジックが理解できる。 |
| 長期的な価値 | C++は40年以上進化し続けており(C++23が登場)、どこにも行かない。 |
▶ サンプル 1:Hello World(難易度 ⭐)
#include <iostream>
int main() {
std::cout << "Hello, C++ World!" << std::endl;
return 0;
}
出力:
TEXT 📖 参照専用Hello, C++ World!
#include <iostream>— 入出力ライブラリをインポート(Pythonのimportに相当)int main()— プログラムのエントリーポイント(Pythonのif __name__ == "__main__":に相当)std::cout << "..."— 画面に出力(Pythonのprint()に相当)return 0;— OSに「プログラムは正常に終了した」と伝える(0は成功を意味する)
▶ サンプル 2:C++はどれくらい速いか?(難易度 ⭐⭐)
#include <iostream>
#include <chrono>
int main() {
// chronoを使った高精度タイマー
auto start = std::chrono::high_resolution_clock::now();
// 10億回の空のループを実行
long count = 0;
for (long i = 0; i < 1'000'000'000; i++) {
count++;
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration<double>(end - start).count();
std::cout << "10億回のループにかかった時間: " << duration << " 秒" << std::endl;
return 0;
}
chronoはナノ秒精度のC++11タイミングライブラリ。すべての詳細を理解する必要はない——C++のスタイルを感じてほしい:#includeでライブラリをインポート、int main()がエントリーポイント、std::coutで出力。using namespace std;を使えば毎回std::と書く必要がなくなる。
3. C++ vs C vs Python
| 項目 | C | C++ | Python |
|---|---|---|---|
| タイプ | コンパイル型 | コンパイル型 | インタプリタ型 |
| パラダイム | 手続き型 | マルチパラダイム(手続き型 + OOP + ジェネリック) | マルチパラダイム(OOP + 関数型) |
| メモリ | 手動(malloc/free) | 手動 + スマートポインター(new/delete/unique_ptr) | 自動(GC) |
| パフォーマンス | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ |
| 学習難易度 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ |
| 主な用途 | OSカーネル、ドライバー | ゲームエンジン、HFT、ブラウザエンジン | データサイエンス、AI、Webバックエンド |
| コード量 | 多い | 多い | 少ない |
| エラーメッセージ | 不親切(segfault?がんばって) | 普通(厳格なコンパイラエラー) | 親切(明確なトレースバック) |
(1) 現実の例え
- C — マニュアルトランスミッションのレーシングカー:速いが、クラッチ、ギア、回転数を自分で管理する必要がある。初心者はすぐにエンストする(segfault)。
- C++ — GPSとパーキングセンサー付きのマニュアルトランスミッションのレーシングカー:まだ速いが、安全に使えば便利な支援機能(クラス、テンプレート、スマートポインター)が追加されている。
- Python — 自動運転の電気自動車:快適、コードを書くのは英語を話すような感覚だが、「アクセル全開」にしても追いつけない。
4. C++標準の進化
C++は誕生以来、いくつかの標準改訂を経ており、それぞれが言語をより良く、より使いやすくする新機能を追加している。
| 年 | 標準 | 別名 | 主な新機能 |
|---|---|---|---|
| 1998 | C++98 | 最初のISO標準 | テンプレート、例外、RTTI |
| 2003 | C++03 | バグ修正リリース | 小さな修正 |
| 2011 | C++11 | C++0x | 大きなアップデート:auto、範囲for、nullptr、ラムダ、shared_ptr、thread、初期化リスト |
| 2014 | C++14 | — | 小さな改善(make_unique、汎用ラムダ) |
| 2017 | C++17 | — | 構造化束縛、if constexpr、畳み込み式、string_view、ファイルシステムライブラリ |
| 2020 | C++20 | — | モジュール、コルーチン、コンセプト、Ranges |
| 2023 | C++23 | — | std::print、flat_map、改良されたモジュール |
(1) このコースが使用する標準
C++17 — 「モダンな機能」と「コンパイラサポート」のバランスが良い。
- C++11は「必修」のベースライン(モダンC++の出発点)
- C++17は「推奨」のバランスポイント(ほとんどの機能が本番環境で使用可能)
- C++20は魅力的だが、一部の機能はMinGWのサポートが不完全——必要に応じて触れる
autoはC++11、std::string_viewはC++17。面接で「C++11の新機能は何か」と聞かれたら、それはよくある質問だ。
5. C++で何ができるか?
C++の存在意義は「パフォーマンス要求が極限、ハードウェア制御が精密、エラーが許されない場所」にある。
(1) 用途 1:ゲーム開発(最も一般的)
- ゲームエンジン:Unreal EngineはC++で書かれている
- ゲームロジック:多くのAAAタイトルがコアロジック(レンダリング、物理、AIパスファインディング)にC++を使用
- なぜC++か:ゲームは60fpsでレンダリング、各フレームは16ミリ秒以内——Pythonでは追いつけない
(2) 用途 2:高頻度トレーディング(最も収益性が高い)
- 定量取引システム:ウォール街やロンドンのHFTシステムはマイクロ秒レベルのレイテンシを要求
- なぜC++か:Pythonの関数呼び出しだけで数マイクロ秒かかる;C++はナノ秒レベルで動作
(3) 用途 3:組込みシステム & IoT(最も広範)
- マイクロコントローラープログラム:洗濯機、電子レンジ、スマートウォッチ——すべてC/C++を使用
- 自動車電子機器:Teslaの車載システムは広範なC++コードを実行
- なぜC++か:組込み機器はメモリが限られている(数KBからMB)——C++だけがこれほど精密にメモリを管理できる
(4) 用途 4:ブラウザ & データベースカーネル(最も基本的)
- ブラウザエンジン:ChromeのV8(JavaScriptエンジン)とEdgeのBlinkはC++で書かれている
- データベース:MySQL、PostgreSQL、MongoDBのコアエンジンはC/C++
- なぜC++か:これらのシステムは毎日何十億ものリクエストを処理——小さなパフォーマンス低下でもWeb全体に影響
(5) 用途 5:オペレーティングシステム & ドライバー(最も低レベル)
- オペレーティングシステム:Windows、Linux、macOSカーネルの一部はC/C++
- なぜC++か:OSコードはハードウェアと直接対話——C/C++だけがこのレベルでメモリとハードウェアレジスタを操作できる
6. その他の応用シナリオ
- 高性能サーバー:リアルタイムメッセージング(WeChatバックエンド)、ライブストリーミング——C++がネットワーク層を駆動し、何百万もの同時接続を処理
- グラフィックス & 画像処理:Photoshopのコアアルゴリズム、OpenCV(コンピュータビジョンライブラリ)——すべてC++
- ブロックチェーン:BitcoinとEthereumのコアノード——C++がパフォーマンスとセキュリティを保証
- 科学計算:大規模な数値シミュレーション(天気予報、核物理学)——C++の行列演算がCPUを最大活用
▶ サンプル 3:簡単な電卓(難易度 ⭐)
#include <iostream>
int main() {
int a = 10;
int b = 3;
std::cout << "a = " << a << ", b = " << b << std::endl;
std::cout << "a + b = " << (a + b) << std::endl;
std::cout << "a - b = " << (a - b) << std::endl;
std::cout << "a * b = " << (a * b) << std::endl;
std::cout << "a / b = " << (a / b) << std::endl;
std::cout << "a % b = " << (a % b) << std::endl;
return 0;
}
出力:
TEXT 📖 参照専用a = 10, b = 3 a + b = 13 a - b = 7 a * b = 30 a / b = 3 a % b = 1
❓ よくある質問
new/deleteが必要。deleteを忘れるとメモリリーク。しかしJavaはパフォーマンスのペナルティを払う(VMオーバーヘッド)——だからゲームエンジンとHFTはまだC++を使う。std::stringもない。vector/map)、アルゴリズム(sort/find)、イテレータ。STLをマスターすれば生産性は10倍になる。フェーズ6で深く掘り下げる。📖 まとめ
- C++はCのアップグレード版で、オブジェクト指向プログラミングをサポートし、最高水準のパフォーマンスを誇る
- C++を学ぶ主な理由:極限のパフォーマンス、精密な制御、幅広いキャリア、確かな基盤
- C++ vs Python:コンパイル型/高速/難しい vs インタプリタ型/低速/簡単——異なるシナリオには異なる道具
- C++標準は進化し続ける:C++11(モダンの出発点)、C++17(このコース)、C++20(魅力的だがサポート不完全)
- C++の用途:ゲームエンジン、HFT、組込みシステム、ブラウザエンジン、OSカーネル——すべて「極限パフォーマンス」領域
- STL(標準テンプレートライブラリ)はC++の最大の武器、フェーズ6で詳細に解説
📝 練習問題
-
初級(難易度 ⭐): 「C++で書かれた有名なソフトウェア/ゲーム/システム」を検索し、少なくとも5つの例をリストアップする。C++がどれほど広く使われているか確認する。
-
中級(難易度 ⭐⭐): マシンにC++コンパイラがインストールされているか?ターミナルを開いて
g++ --versionまたはclang++ --versionを実行。何も表示されない場合、OSのバージョン(Windows 10/11?macOS?Linuxディストリビューション?)をメモ。次のレッスンでインストールを解説。 -
上級(難易度 ⭐⭐⭐): C++コミュニティには有名な言葉がある:「C++の構文だけを学んでコンピュータの基礎を理解しなければ、何も学んでいない」。C++を学ぶために必要なコンピュータ基礎についての記事を検索して読む。200文字の考察を書く:C++の前にCを学ぶべきだと思うか?なぜ、またはなぜない?