C++ Learning

第1回 プログラミング言語 C++ とは

C++ とは何か、C 言語とどういう関係にあり、どんな規格で進化してきたのか。本編に入る前にまず全体像を俯瞰し、本サイトの立ち位置(モダン C++ ・C 経験者向け)を共有します。

このページで押さえること
✅ 最低限ここだけ覚える
  • C++ は C の上位互換ではないが、C のほとんどのコードは C++ でも動く
  • C++ は 数年おきに規格が更新され、現在は C++17/20 が主流
  • 本サイトは C++17 を基準に C++20 機能を補足する
⭐ 余裕があれば読む
  • 設計思想:ゼロコスト抽象化マルチパラダイム
  • C++03 / 11 / 14 / 17 / 20 / 23 の主な追加機能
  • 「古い C++」と「モダン C++」が何を指すか

1. C++ とはどんな言語か

C++ は、1980 年代初頭に Bjarne Stroustrup が C 言語を拡張する形で設計を始めたプログラミング言語です。もとは「C with Classes」という名前で、C にクラスと継承を足した「少し便利な C」として出発しました。

現在の C++ は、クラス・テンプレート・例外処理・ラムダ式・スマートポインタ・並行処理など豊富な機能を備えた大きな言語に成長しており、OS・組込み・ゲーム・ブラウザ・データベース・金融システムなど、高性能と抽象化の両立が求められる領域で広く使われています。

抽象度と速度の両立: C のように低レベルな操作(ポインタ・メモリ配置の直接制御)ができる一方で、Python や Java に近い抽象化(クラス・ジェネリクス・関数オブジェクト)も使える、という二面性が C++ の特徴です。

2. C と C++ の関係

C++ は C を土台に作られているので、C のプログラムの多くは C++ としてもほぼそのまま動きます。ただし厳密には「C++ は C の上位互換」ではなく、いくつか C では許されるが C++ では許されない書き方が存在します(たとえば void* からの暗黙変換、非 const な文字列リテラルへの代入など)。

重要なのは、C++ は「強化された C」ではなく「別の言語」だという理解です。C で書けるものを C++ でも書けますが、C++ にはクラスや RAII、テンプレートなど、C にはないツールが多数揃っており、C と同じ流儀で書くと C++ の価値は半分も引き出せません

本サイトの立ち位置: C の基礎(ポインタ、構造体、malloc/free)を学び終えた方を想定し、「C でこう書いていたものが、C++ ならこう書ける」という差分に焦点を当てて進めます。

3. 規格の歴史(C++98 〜 C++23)

C++ には ISO 標準化された規格があり、おおよそ 3 年ごとに更新されています。どの規格まで使えるかはコンパイラと -std オプションで決まります。各版のタブをクリックして主な追加機能を確認してください。

C++98 / C++03 ― 原点
最初の ISO 標準化。以降の C++ の土台になる機能が定義されました。
  • クラス・継承・仮想関数(オブジェクト指向の基本)
  • テンプレート(ジェネリックプログラミング)
  • 例外処理(try / catch / throw
  • STL(vector, map, string, アルゴリズム)
  • 名前空間(namespace std
モダン C++ とは: 一般に C++11 以降を指す呼び方です。スマートポインタ、ムーブセマンティクス、auto、ラムダ式、範囲 for といった「C++ の書き方を一変させた」機能が C++11 で一気に入ったため、ここで線引きされます。
余裕があれば読む ― ここから先は応用・発展
最低限の理解は上の 3 節で完結します。深掘りしたい人だけ読んでください。時間がなければ次章に進んで OK。

4. 設計思想

C++ の設計判断を理解すると、文法の背景が掴みやすくなります。重要な 3 つの原則を押さえておきましょう。

① ゼロコスト抽象化

「使わない機能には対価を払わない」「使う機能も、手書きの C とほぼ同等の速度で動く」という原則です。クラスやテンプレート、ラムダ式などの抽象化機能を使っても、実行時オーバーヘッドが最小限になるように設計されています。

② C との互換性

C のコードをできる限り再利用できるよう、C の文法・ABI・標準ライブラリを取り込んでいます。extern "C" 宣言で C のライブラリを C++ から呼び出すこともできます。

③ マルチパラダイム

手続き型(C 風)、オブジェクト指向(クラス・継承・多態)、ジェネリック(テンプレート)、関数型(ラムダ・std::function)を 同じ言語の中で混在できます。どのパラダイムを採るかはプログラマが選びます。

5. C から見て何が加わったか

本サイト全編で繰り返し取り上げる「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 のコードをまず見せる → C++ でどう書けるかを見せる → 仕組みと選び方を説明する」の順で扱います。

6. 本サイトの方針

C++ の規格は広大で、全機能を網羅しようとすると入門者は必ず迷子になります。そこで本サイトは次の方針を採ります。

C 言語の基礎がまだ不安な場合は、先に C 言語の入門サイト でポインタ・構造体・動的メモリまで学んでから戻ると、C++ 側の各章がぐっと読みやすくなります。

広告スペース

確認クイズ

ここまでの理解を 3 問で確認してみましょう。

Q1. 本サイトが基準にしている C++ の規格はどれですか?

C++03
C++11
C++17
C++23
C++17 を基準に、C++20 の主要機能(コンセプト・std::span・Ranges など)は補足として扱う方針です。

Q2. 「モダン C++」という言葉が一般に指すのはどの規格以降ですか?

C++98
C++11
C++14
C++20
C++11 で auto、ラムダ式、ムーブセマンティクス、スマートポインタ、範囲 for などが一気に入り、書き方が根本から変わったため、ここから「モダン C++」と呼ぶのが一般的です。

Q3. C++ の設計原則として最も広く知られているものはどれですか?

実行速度を犠牲にしてでも書きやすさを優先する
ゼロコスト抽象化(使わない機能には対価を払わない)
ガーベジコレクションで自動メモリ管理
C との互換性を完全に捨てて再設計する
C++ は「使わない機能には対価を払わない/使う機能も C と同等の速度で動く」を核原則に設計されています。これがクラスやテンプレートを手書きの C と同等の速度で動かせる理由です。
この記事をシェア