AT&Tベル研究所のBjarne Stroustrupにより、1982(昭和57)年に開発されたCのスーパーセット言語。
C++の名の由来は、ポインタ変数Cを++(インクリメント: 1つ進める)する、つまり、一歩進んだC言語という意味である。
C++は、C風のオブジェクト指向プログラミング言語であるが、Cの上位互換というわけではない。現実に、細かな箇所で、様々な互換性が損なわれる仕様変更がなされている。
仕様差が顕著なのは、型チェック機能などに関する箇所が多い。幾つかの例を紹介する。
型チェック機能は、「NULL」にも影響を及ぼしている。
NULLは、無効ポインタを表わすのに頻用され、標準ライブラリ関数でも無効時にNULLを返すようなものは多い。しかし、この仕様がCとC++では違う。同じにできなかったのである。
Cの場合、
#define NULL ((void *)0)
のように定義されることが多く、これによってポインタと数値0を間違えないよう、コンパイラレベルで判断可能なように配慮した実装が多かった。
しかしC++では型チェックが厳密化された影響で、上記のままのNULLを他の変数に代入しようとすると、「void *を、他の型のポインタ変数に代入できない。」といった趣旨のエラーを出してしまうのである。
だからといって型ごとにNULL相当を用意するのも無駄に過ぎるので、やむを得ずC++では、ポインタの値として数値0は「どこも指し示さない」という意味として定義し、もってコンパイラは次のように定義することになった。
#define NULL 0
こうなるともはや、ポインタと数値の区別は不可能であり、この点においてC++は、Cより「退化した」と言うことができる。
Cでは、関数のプロトタイプ宣言において、引数を何も取らない場合はvoidを明示する必要があった(例: int func(void);)。
C++では任意である。書いても良いし、書かなくても良い。voidを省略すると、値を受け取らない関数を意味する。
戻り値を返すよう宣言されている関数で、戻り値を返さなかった場合の挙動が変更された。
Cでは不定値が返る(但し、通常はコンパイラが警告を出す。バグの可能性が濃厚だからである)。
C++ではエラーになり、コンパイルそのものができない。
Cでは、ローカル変数は関数ブロックの先頭で宣言されねばならない。
対しC++では、関数内のどこででも宣言できる。またfor文やif文条件式内でも宣言でき、この場合はそのブロック内でのみ有効な変数となる。
for (int i=0; i<10; i++) { puts("hello, world"); }