web-dev-qa-db-ja.com

CとC ++の基本的な違いは何ですか?

多くの人は、まるで同じものであるかのように、「C/C++」を書く傾向があります。それらは多くの類似点を共有していますが、明らかに同じではありません。

しかし、CとC++の根本的な違いは何ですか? C++はCの拡張バージョンですか、それともC++にはない機能がCにありますか?

41
gablin

以下の点はC++に関連しています。

  1. (user-defined)static type system:は、データとその使用に関する静的チェックを可能にします-Cで簡単に実行できる多くのエラーを示します。
  2. multi- "paradigm": Cのように、オブジェクト指向のパラダイム、一般的なパラダイムなどで機能します。
  3. Constructor/Destructor:何かを作成または破棄するときに何をすべきかを一度だけ言う唯一の方法であり、ユーザーがCのように適切な関数を見つけて使用する必要がないことを確認します。
  4. RAII(悪い名前):常にメモリを管理する必要はありません。スコープ内にオブジェクトを保持し、オブジェクトの有効期間を表すスマートポインターを使用してください。それでも生のポインタを使用できます。
  5. テンプレート:マクロよりも優れています。マクロは、最終的なコンパイルの前に型を操作および生成するための実際の言語です。型システムが欠けているだけです(将来のC++標準の概念を参照)。
  6. Operator overloads:を使用すると、簡単な構文で操作を記述したり、C++コード内にドメイン固有の言語を埋め込んだりすることもできます。
  7. スコープ名:名前空間、クラス/構造体、関数などには、名前が衝突しないようにするための簡単なルールがあります。
  8. Exception system:リターンコードよりも優れていることが多いエラーを伝播する方法。実際、戻りコードは、アプリケーションが管理する必要があるため、ドメイン固有の論理エラーに適しています。例外は「ハード」エラー、次のコードを正しくないものにするために使用されます。可能であれば、コールスタックでより高いエラーをキャッチし、そのような例外に(ロギングまたは状態を修正することにより)対応し、RAIIを使用すると、プログラム全体が間違ってしまうことはありません。
  9. 標準ライブラリ: Cには独自の機能がありますが、すべて「動的」です。 C++標準ライブラリは、ほとんど(IOストリームではなく))テンプレート(コンテナとアルゴリズム)で構成されており、使用するものに対してのみコードを生成できます。より良い:コンパイラがコードを生成する必要があるため、テンプレートなどのおかげで、コンテキストについて多くの知識があり、コードを難読化するためにコーダーに要求する必要なく、快く多くの最適化を適用します。
  10. const-correctness:変更すべきでない変数を変更しないようにするための最良の方法。変数への読み取り専用アクセスを指定できます。また、コンパイル時にのみチェックされるため、実行時のコストはかかりません。
43
Klaim

C++は、Cが処理できない複雑さを管理するために発明されました。たとえば、Cの一般的な問題は、カプセル化や名前空間などがないため、「変数の名前が不足する」ことになります(文字どおりに解釈されるべきではありません)。

また、Cには例外がありません。したがって、関数の戻り値を常に確認することはライブラリユーザーに依存するため、エラー処理は非常にエラーが発生しやすくなります。一方、例外がある場合、ライブラリ開発者はプログラムフローの停止を保証する例外をスローするだけです。

C++は、コンパイラーによって自動的に呼び出されるコンストラクターの初期化オブジェクトを持つことで役立ちます。プログラマーが初期化する必要があるC構造体とは異なり(エラーが発生しやすい別の領域)。

最後に、オブジェクトの再利用や、ソースコードなどの再利用を可能にするテンプレートやジェネリックなどのジェネリックプログラミングベースの概念など、OOPが推奨する多くの他の利点があります。

31
Jas

一般に、Cに存在するものはすべてC++でサポートされています。明らかにその反対は絶対に誤りです。

簡単に言えば、C++はオブジェクト指向です(たとえば、クラスがあります)。Cはそうではありません。

C++にはブール型があり、C89にはありません。

彼らは異なる言語です。構文のほとんどを共有しています。

15

C99には、C++には存在しない(少なくともまったく同じ形式の)機能がいくつかあります(たとえば、柔軟な配列メンバー、可変長配列など)。

C99は、C++ 98/03標準にはないライブラリにも多くを追加しました。ただし、これのほとんどはC++ 11に追加されています。

基本的な方向に関して、Cは基本的に構造化手続き型プログラミングをサポートしています。 C++は、オブジェクト指向プログラミング、汎用プログラミング、およびメタプログラミング(コンパイル時に任意の計算を実行する)だけでなく、それもサポートしています。 C++ 11を使用すると、少なくとも関数型プログラミングのサポートと間違われる可能性があるいくつかの要素が追加されます(ラムダ式など)。 C++ 14にはさらにいくつか追加されていますが、それらのほとんどは、方向の大幅な変更というよりも、本当に便利です。

8
Jerry Coffin

個人的には、テンプレートはC++がCに追加する最も重要な機能だと思います。

1
zvrba