C++ とは何か、C 言語とどういう関係にあり、どんな規格で進化してきたのか。本編に入る前にまず全体像を俯瞰し、本サイトの立ち位置(モダン C++ ・C 経験者向け)を共有します。
C++ は、1980 年代初頭に Bjarne Stroustrup が C 言語を拡張する形で設計を始めたプログラミング言語です。もとは「C with Classes」という名前で、C にクラスと継承を足した「少し便利な C」として出発しました。
現在の C++ は、クラス・テンプレート・例外処理・ラムダ式・スマートポインタ・並行処理など豊富な機能を備えた大きな言語に成長しており、OS・組込み・ゲーム・ブラウザ・データベース・金融システムなど、高性能と抽象化の両立が求められる領域で広く使われています。
C++ は C を土台に作られているので、C のプログラムの多くは C++ としてもほぼそのまま動きます。ただし厳密には「C++ は C の上位互換」ではなく、いくつか C では許されるが C++ では許されない書き方が存在します(たとえば void* からの暗黙変換、非 const な文字列リテラルへの代入など)。
重要なのは、C++ は「強化された C」ではなく「別の言語」だという理解です。C で書けるものを C++ でも書けますが、C++ にはクラスや RAII、テンプレートなど、C にはないツールが多数揃っており、C と同じ流儀で書くと C++ の価値は半分も引き出せません。
malloc/free)を学び終えた方を想定し、「C でこう書いていたものが、C++ ならこう書ける」という差分に焦点を当てて進めます。
C++ には ISO 標準化された規格があり、おおよそ 3 年ごとに更新されています。どの規格まで使えるかはコンパイラと -std オプションで決まります。各版のタブをクリックして主な追加機能を確認してください。
try / catch / throw)vector, map, string, アルゴリズム)namespace std)auto、ラムダ式、範囲 for といった「C++ の書き方を一変させた」機能が C++11 で一気に入ったため、ここで線引きされます。
C++ の設計判断を理解すると、文法の背景が掴みやすくなります。重要な 3 つの原則を押さえておきましょう。
「使わない機能には対価を払わない」「使う機能も、手書きの C とほぼ同等の速度で動く」という原則です。クラスやテンプレート、ラムダ式などの抽象化機能を使っても、実行時オーバーヘッドが最小限になるように設計されています。
C のコードをできる限り再利用できるよう、C の文法・ABI・標準ライブラリを取り込んでいます。extern "C" 宣言で C のライブラリを C++ から呼び出すこともできます。
手続き型(C 風)、オブジェクト指向(クラス・継承・多態)、ジェネリック(テンプレート)、関数型(ラムダ・std::function)を 同じ言語の中で混在できます。どのパラダイムを採るかはプログラマが選びます。
本サイト全編で繰り返し取り上げる「C ではこう書く / C++ ならこう書く」の関係を、最初に俯瞰しておきます。細かい使い方は各章で扱います。
| 分野 | C 言語での書き方 | C++ で加わった道具 |
|---|---|---|
| 入出力 | printf / scanf(書式指定子) |
std::cout / std::cin(型安全) |
| 関数引数 | ポインタ(int*)で参照を渡す |
参照(int&)でそのまま渡せる |
| 配列 | 生配列 + malloc/realloc の手動管理 |
std::vector / std::array |
| 文字列 | char* + strcpy / strcmp |
std::string(+/==/連結が自然) |
| データ集約 | 構造体 + 関数の組み合わせ | クラス(メンバ関数と可視性) |
| 資源管理 | malloc/free、手動で解放 |
RAII + unique_ptr / shared_ptr |
| エラー処理 | 戻り値 + errno チェック |
例外(try/catch)+ std::optional |
| アルゴリズム | for ループで自作 | std::sort / find / transform など多数 |
| 汎用化 | マクロ(#define)や void* キャスト |
テンプレート(型安全なジェネリック) |
| 並行処理 | pthread(POSIX 依存) |
std::thread / mutex / async |
C++ の規格は広大で、全機能を網羅しようとすると入門者は必ず迷子になります。そこで本サイトは次の方針を採ります。
std::span、Ranges)を補足として扱うnew/delete 直書きは避け、スマートポインタと RAII を最初から使うC 言語の基礎がまだ不安な場合は、先に C 言語の入門サイト でポインタ・構造体・動的メモリまで学んでから戻ると、C++ 側の各章がぐっと読みやすくなります。
ここまでの理解を 3 問で確認してみましょう。