C++
読み:スィープラスプラス
外語:C++

 AT&Tベル研究所のストラウストラップにより、1982(昭和57)年に開発されたCのスーパーセット言語。
目次

情報

由来

言語の由来
 Cを基礎とし、完全な上位互換ではないものの、Cに型チェック機能やデータ抽象化機能、演算子のオーバーロードオブジェクト指向プログラミング機能などが追加された。
 このため、Microsoft Windowsなどのプログラミングの主要言語として用いられている。

名称の由来
 C++の名の由来は、ポインター変数Cを++(インクリメント: 1つ進める)する、つまり、一歩進んだC言語という意味である。

沿革
 特定の版を指すときには、C++の前後に年数などを付けて呼ぶのがC++作者の提案である。
 以下予定
 さらに予定

Cとの違い

Cとの仕様差
 C++は、C風のオブジェクト指向プログラミング言語であるが、Cの上位互換というわけではない。現実に、細かな箇所で、様々な互換性が損なわれる仕様変更がなされている。
 仕様差が顕著なのは、型チェック機能などに関する箇所が多い。幾つかの例を紹介する。

文字定数
 CやC++は、文字は'で括って表現する。例えば、'X'と記述すると、文字Xを表わす。
 Cではこの文字は常にintに等しいが、C++ではchar/short/longのいずれかとなりうる。
 現在のC++では、ANSI文字では'文字'とし、wchar_t文字はプリフィックスLを使い、L'文字'とすることになっている。ANSIならchar/longなどから選択され、wchar_t文字ならshortとなるだろう(実装依存)。

NULL
 型チェック機能は、「NULL」にも影響を及ぼしている。
 NULLは、無効ポインターを表わすのに頻用され、標準ライブラリ関数でも無効時にNULLを返すようなものは多い。しかし、この仕様がCとC++では違う。同じにできなかったのである。
 Cの場合、
 #define NULL ((void *)0)
 のように定義されることが多く、これによってポインターと数値0を間違えないよう、コンパイラーレベルで判断可能なように配慮した実装が多かった。
 しかしC++では型チェックが厳密化された影響で、上記のままのNULLを他の変数に代入しようとすると、「void *を、他の型のポインター変数に代入できない。」といった趣旨のエラーを出してしまうのである。
 だからといって型ごとにNULL相当を用意するのも無駄に過ぎるので、やむを得ずC++では、ポインターの値として数値0は「どこも指し示さない」という意味として定義し、もってコンパイラーは次のように定義することになった。
 #define NULL 0
 こうなるともはや、ポインターと数値の区別は不可能である。この点においてC++は、(賛否両論はあるが)Cより「退化した」と考えられた。
 C++ではせっかく型チェックが強化されているのに、これでは魅力が半減である。そこでこの解決方法が模索された結果、ISO/IEC 14882:2011(C++11)になってnullptrが予約語に追加された。

関数のプロトタイプ宣言
 Cでは、関数のプロトタイプ宣言において、引数を何も取らない場合はvoidを明示する必要があった(例: int func(void);)。
 C++では任意である。書いても良いし、書かなくても良い。voidを省略すると、値を受け取らない関数を意味する。

関数定義
 Cでは、関数定義において、引数を何も取らない場合はvoidを明示する必要があった。
 int func(void) { /* ... */ }
 C++では任意である。書いても良いし、書かなくても良い。voidを省略すると、値を受け取らない関数を意味する。
 また、C++では旧式のC形式(いわゆるK&Rスタイル)での関数定義は使用できない。次は不正である。
 int func(p1, p2) int p1, p2; { /* ... */ }

関数の返却値
 戻り値を返すよう宣言されている関数で、戻り値を返さなかった場合の挙動が変更された。
 Cでは不定値が返る(但し、通常はコンパイラーが警告を出す。バグの可能性が濃厚だからである)。
 C++ではエラーになり、コンパイルそのものができない。

関数内での変数宣言
 Cでは、ローカル変数は関数ブロックの先頭で宣言されねばならない。
 対しC++では、関数内のどこででも宣言できる。またfor文やif文条件式内でも宣言でき、この場合はそのブロック内でのみ有効な変数となる。
 for (int i=0; i<10; i++) { puts("hello, world"); }

特徴

名前空間
 標準C++では、標準の名前空間としてstdを定義している。
 但し、旧式のC++では、名前空間stdは使われておらずグローバルで定義されていた。
 両者はincludeで区別される。名前空間を使わない旧式C++はCと同様に.hの付いたファイルをincludeし、名前空間を使う標準C++は、.hを付けないファイルをincludeする。
 #include <iostream.h>
 #include <iostream>
 現在は前者(旧式)を使うメリットはない。
 従って、特に理由がない限りは後者の標準C++形式つまり.hのないものをincludeし、名前空間stdを使用する。

std

再検索