ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
AT&Tベル研究所のストラウストラップにより、1982(昭和57)年に開発されたCのスーパーセット言語。
Cを基礎とし、完全な上位互換ではないものの、Cに型チェック機能やデータ抽象化機能、演算子のオーバーロード、オブジェクト指向プログラミング機能などが追加された。
このため、Microsoft Windowsなどのプログラミングの主要言語として用いられている。
特定の版を指すときには、C++の前後に年数などを付けて呼ぶのが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++ではせっかく型チェックが強化されているのに、これでは魅力が半減である。そこでこの解決方法が模索された結果、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を使用する。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます