プログラミング言語 C++について調べてみました。
C++とは?C言語との違い
C++は、文字通りC言語の拡張版で、元々はC言語にオブジェクト指向の概念を取り入れたものでした。
C++(シープラスプラス)は、汎用プログラミング言語の一つである。日本語では略してシープラプラ、シープラなどとも呼ばれる。
1983年にベル研究所のコンピュータ科学者のビャーネ・ストロヴストルップが、C言語の拡張として開発した。当時の名前は「C with Classes」(クラス付きのC言語)だった。拡張はクラスの追加に始まり、仮想関数、多重定義、多重継承、テンプレート、例外処理といった機能が続いていった。
標準規格化がISOとIEC共同で行われており、現在最新のバージョンは、2017年に制定されたISO/IEC 14882:2017、通称「C++17」である。
表現力と効率性の向上のために、手続き型プログラミング・データ抽象・オブジェクト指向プログラミング・ジェネリックプログラミングの複数のプログラミングパラダイムを組み合わせている。アセンブリ言語以外の低水準言語を必要としない、使わない機能に時間的・空間的費用を要しないことが、言語設計の重要な原則となっている。また、静的な型システムを持つ。
C++ の特徴は?できること、難しい?
一般にC++は、C言語の上位互換で、C言語にクラスの概念や多重継承、例外処理を追加したものと言われています。
そのため、C言語でできることは、ほぼすべてC++でもできます。
C言語の欠点を無くし、新たなよい概念を取り入れたとも言えるのですが、それゆえに、言語仕様は複雑で難しい言語とも言えます。
C++の後で生まれたJavaやC#は、C++よりもシンプルな言語仕様になっています。
C言語に、オブジェクト指向プログラミングをはじめとする様々なプログラミングパラダイムをサポートするための改良が加えられたものといえる。ただし、他のプログラミング言語と違い、旧来のCと同様に手続き型言語としても扱えるという特徴がある。このことから、C++をbetter Cというふうに呼ぶことがある。すなわち、基本的にC言語に対して上位互換性がある。初期のC++はCへのトランスレータとして実装され、C++プログラムを一旦Cプログラムに変換してからコンパイルしていた。
ただし、C++という名称が定まった当初の時期から、C言語とC++との間には厳密な互換性はない。当時、Cとの互換性について議論の末、「C++とANSI Cの間には不正当な非互換性はない」という合意が形成されることとなった。そのため、正当な非互換性を巡って多くの議論が発生した。ただし、まだANSIによるC言語の標準規格も策定途中の時期である。
その後、先祖であるC言語のANSIによる標準規格制定時には、関数のプロトタイプ宣言やconst修飾など、C++の機能がC言語に取り入れられることにもなった。C99の出現により、//コメントなどのC++で使われていた便利な機能が加わってCとC++の互換性が高まる一方、別々に審議し、別の時期に発行していることと、開発対象が必ずしも同じでないために利害関係者が異なることによる違いもある。
次のような多種多様な機能を持っており、言語仕様は大変複雑である。
- 多重継承
- テンプレート
- 演算子のオーバーロード
- 例外処理
- 実行時型情報 (RTTI)
ここから、よりオブジェクト指向を強化し、「なんでもあり」ではない代わりに分かりやすくスマートな設計を目指した新たな言語(Java、D言語など)が作られることとなった。
C++ 初心者のための入門サイト
C++はC言語をマスターした後に学習するのがよいとされます。
そのため、まず、C言語をマスターしましょう。
C言語をマスターした後、C++を初心者が学ぶための入門サイトはいくつかあります。
以下にまとめました。
一週間で身につくC++言語の基本
C++入門
C++ Tutorial (英語サイト)
C++を学習する本
C++を学習するためのバイブルは、C++の開発者であるビャーネ・ストラウストラップ (Bjarne Stroustrup) が書いた「プログラミング言語C++」です。
新品価格 |
C++ 記号の意味
C++ではC言語に比べて特に、記号の意味が分かりにくいです。
以下のサイトに記号の意味がまとめてあります。
よく使われる記号の意味を見てみましょう。
括弧の意味、呼び方
< > 山括弧・・・クラスの型引数を書く
[ ] 角括弧、大括弧・・・配列で使う
{ } 波括弧、中括弧・・・関数をくくる時に使う
( ) 丸括弧、小括弧・・・メソッドの引数を書く
左シフト演算子および右シフト演算子 (<< および >>)の意味
<<は、左シフト演算子。
ストリームクラスではオーバーロードされ、ストリーム出力に使用される。
unsigned x = 1u << 8; //1を8bit左シフトする。x=256 std::cout << "result:" << x; //標準出力に「result:256」と出力
>> は、右シフト演算子。
ストリームクラスではオーバーロードされ、ストリーム入力に使用される。
ダブルコロン ::の意味
C++での::(コロン2つ)は、名前空間(namespace)の区切りを表します。
std::coutは「std名前空間のcoutという変数」といった解釈になります。
また、メソッドの頭にコロン2つを残してるのには何の意味があるのでしょうか?
どの名前空間にも属さない変数は、グローバル名前空間(global namespace)という特別な名前空間に属しています。このような変数を指し示すときに::fooという書き方になります(前例のstd部分が省略された状態)。
->の意味
-> は「アロー演算子」「矢印演算子」と呼ばれます。
a->next とすると、ポインタ a が指す構造体のフィールド next を読み書きできます。
(*a).next と同じ意味です。
^ ハットマークの意味
C++/CLIで使うことの出来る記号です。
C++/CLIは、.NET Frameworkの共通言語基盤 (CLI)上で実行するプログラムを作るためにC++を拡張したプログラミング言語である。前身であるC++マネージ拡張に比べて単純でわかりやすい構文になり、可読性も向上している。
^(ハットマーク)は実体がヒープに確保されるという意味です。
.NET Frameworkのクラスはガベージコレクションで管理されている為C++のクラスとは別に管理する必要があります。
その為^(ハットマーク)をつける事により区別しています。
C++とJavaとの違い
JavaとC++の違いについては以下に詳しく書いてあります。
https://ja.wikipedia.org/wiki/JavaとC++の比較
C++ | Java |
---|---|
Cとの後方(下位)互換性 | Java以外の言語との互換性はない |
プログラマを当てにする | プログラマを守る |
低レベル機能に触れる | オブジェクトを通してのみメモリアクセス |
簡潔な表現 | 明確な表現 |
明示的な型破壊を許可 | 型安全性 |
マルチパラダイム(手続き型、オブジェクト指向、関数型、総称型) | オブジェクト指向、総称型 |
演算子多重定義 | 演算子の効果は不変 |
限られた範囲の標準ライブラリ | (GUI、ネットワーク、マルチスレッドを含む)機能豊富で容易に使用できる標準ライブラリ |
組み込み、パーソナルコンピュータ、ワークステーション | 業務システム(Webフロントエンド、Webバックエンド)、携帯端末 |
C言語、C#、Javaについては以下にまとめました。
コメント