C++

読み:スィープラスプラス
読み:スィープラプラ
外語:C++ 英語
品詞:名詞

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

目次

言語の由来

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

このため、Microsoft Windowsなどのプログラミングの主要言語として用いられている。

名称の由来

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

沿革

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

  • ARM C++ (The Annotated C++ Reference Manual)
  • C++98 (ISO/IEC 14882:1998) First Edition
  • C++03 (ISO/IEC 14882:2003、JIS X 3014:2003) Second Edition
  • C++11 (ISO/IEC 14882:2011) Third Edition

以下予定

さらに予定

  • C++1y (2017(平成29)年頃予定) Fifth Edition

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

  • 標準入出力ストリーム オブジェクト
  • マニピュレーター
    • std::endl ‐ 改行の出力とバッファーのフラッシュ
    • std::flush ‐ 出力バッファーのフラッシュ
    • std::ends ‐ 終端文字 '\0' の出力
    • std::ws ‐ 空白文字を読み飛ばして入力

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club