C++言語の特徴
C++はコンパイラ言語
作成したプログラムを実行するには、ソースコードに二つの処理工程を経る必要がある。記述したコードは文字テキストに過ぎずコンピューターは理解できないため、コンパイラがテキスト記号をCPUが解釈可能な命令列=機械語に変換する。CPUはこの機械語を1行ずつ実行する仕組みだ。
- コンパイル:コンパイラがソースファイルを読み込み、オブジェクトファイルを生成;
- リンク:リンカーが複数のオブジェクトファイルを統合し、実行可能ファイルを出力。
C++プロジェクトは通常複数のソースファイルで構成される。処理フローの模式図は以下の通り:

生成された実行ファイルは特定のハードウェア・OSに紐付いており、そのままクロスプラットフォームで動作させることはできない(Mac用プログラムをWindows PCにコピーしても起動できない)
一般的に言われるC++の移植性とは、ソースコードの移植性を指す。同一のソースコードを複数のOS上でそれぞれコンパイルすれば正常に動作する。
つまりWindows上でコンパイルしたexeファイルをMacにコピーしても動かない。.cppや.hのソーステキストをMacに移し、Mac向けC++コンパイラで再度ビルドしてMac用実行ファイルを作成する、これが移植性の意味である。
C++ ISO規格
ISO C++規格は大きく2つの要素で定義される
- 言語コア機能:言語標準に内蔵された基礎機能。
char/intなど組み込み型、for/whileループなどが該当する。 - 標準ライブラリコンポーネント:公式付属のツール群。
vector/mapコンテナ、<<による出力、getline()による入力取得などIO操作を含む。
標準ライブラリは全て純粋なC++コードで実装され、各種コンパイラに標準搭載されている。スレッドコンテキスト切り替えといったごく一部の低レイヤ処理のみ少量の機械語を使用する。
なぜ標準ライブラリが必要なのか。標準ライブラリは近年よく聞くSDKと同じ役割を持ち、開発者の工数を削減する目的がある。全ての基礎機能を開発者が一から実装すると、この言語は普及しなかっただろう。例えばコンソールにテキストを出力する処理を開発者ごとに独自作成すると膨大な重複作業が発生する。この課題を解決するため、C++設計者が事前に一式のコードを作成しライブラリ(lib)として提供している。平たく言えば車輪の再発明を避け、開発効率を大幅に高め利用者を増やすための仕組みだ。
標準ライブラリは特殊な文法の裏技で実装されておらず、純粋なC++で記述されている。ソースコードを読み解き、同種のツールを自作することも完全に可能。
C++は静的型付け言語
全ての変数、値、識別子、式はコード内で使用する箇所において、コンパイラが型を明確に把握している必要がある。オブジェクトの型によって実行可能な演算・操作が決まる。
静的型付けの核心的メリット:コンパイル時に型検査が実行され、多くの不具合が実行前にコンパイラによって検知されるため、実行時クラッシュを防ぎ安全性とパフォーマンスを両立できる。詳しく説明すると、コンパイラがコードを機械語に変換する際、型の不整合があればエラーを出力する。例えば年齢用の整数変数に人名テキストを代入するとコンパイルエラーが発生する。コンパイル時エラーは開発者が即時修正可能だが、実行時エラーはソフトウェアが配布済みの場合対応が非常に困難になる。