通信用語の基礎知識 戻る
アスカネットワークサービス

C++

読み:スィープラスプラス
読み:スィープラプラ
外語:C++
品詞:名詞
2006/10/27 作成
2007/08/30 更新

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

言語の由来

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

このため、近年のGUIプログラミングの主要言語として用いられている。

名称の由来

C++の名の由来は、ポインタ変数Cを++(インクリメント: 1つ進める)する、つまり、一歩進んだ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では、関数のプロトタイプ宣言において、引数を何も取らない場合はvoidを明示する必要があった(例: int func(void);)。

C++では任意である。書いても良いし、書かなくても良い。voidを省略すると、値を受け取らない関数を意味する。

関数の返却値

戻り値を返すよう宣言されている関数で、戻り値を返さなかった場合の挙動が変更された。

Cでは不定値が返る(但し、通常はコンパイラが警告を出す。バグの可能性が濃厚だからである)。

C++ではエラーになり、コンパイルそのものができない。

関数内での変数宣言

Cでは、ローカル変数は関数ブロックの先頭で宣言されねばならない。

対しC++では、関数内のどこででも宣言できる。またfor文やif文条件式内でも宣言でき、この場合はそのブロック内でのみ有効な変数となる。

for (int i=0; i<10; i++) { puts("hello, world"); }