CとC ++の基本的な違いは何ですか?[閉まっている]


41

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

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


2
C ++はCのスーパーセットだと思った
ユーザー

1
C ++が強化されていません... C ...のそのスーパーセット
ジョー・DF

2
@JoeDFそれは最初の頃でしたが、実際には「Cと互換性があります」ので、まったく同じことを意味するものではありません。C ++でCをコーディングしないでください。また、すべての標準Cが標準C ++と互換性があるわけではありません。
クライム14年

+1あなたは正しいです、兄弟やいとこのようになりました。お分かりでしょうが。
ジョーDF 14年

回答:


43

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

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

31

C ++は、Cが処理できない複雑さを管理するために考案されました。たとえば、Cの一般的な問題は、カプセル化や名前空間などがなかったため、「変数の名前を使い果たしてしまう」ことです(もちろん、文字どおりに解釈しないでください)。

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

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

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

そして、ここにリストするのに私の時間がかかりすぎる他の多くのこと。


C ++コンストラクターとC構造体について書いて、エラーが発生しやすいことが好きです。私はそれに同意します。ただし、JavaBeansでこれを使用するJavaの方法は好きではありません。Javaの方法では、常に空のコンストラクターを使用してから、セッターでメンバーフィールドを設定します。私の観点では、C構造体と同じくらいエラーが発生しやすいです。Javaオブジェクトをコンストラクターのみで設定したいと思います。これに関するStackOverflowに関する私の質問を参照してください。
ジョナス

あなたはそこにポイントを持っていますが、ここでの私の答えの焦点はC対C ++でした。
ヤコ

1
ああ、CでOOPを使用できないのは誰ですか?オブジェクトを再利用して、例外を含めて何でもできます。Cに関するOOPプログラミングと呼ばれるそれに関する本さえあります。

2
@Vlad、あなたが話していることは、25年前には選択肢でした。
ジャス

4
まだ使用されているほぼすべてのプログラミング言語でOOPを実行できますが、その言語がそのために設計されたわけではありません。たとえば、Luaを見てください。技術的にはOOPを許可しますが、それを行うには約50の異なる方法があり、多くの頭痛の原因となっているようです。
-tyjkenn

15

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

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

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

それらは異なる言語です。ほとんどの構文を共有するだけです。


4
C99にはブール型があります(名前_Boolbool、エイリアスとして)。
ジェリーコフィン

1
これは厳密には正しくありません。たとえば、C99にはlong long(まだ)ISO C ++の一部ではないデータ型があります。
チンメイカンチ

11
エラー... C ++はオブジェクト指向であるだけでなく、言語がその機能を提供するためC ++でオブジェクト指向のパラダイムを使用できますが、他のパラダイムにも機能を提供します。あなたはそれを言及する必要があります、それは本当に重要です、それはすべてを変えます。そうでない場合は、すべてjavaに切り替える必要があります
...-クライム

4
Cには、C ++では機能しない多くの構成体があります。

1
@klez:はい-しかし、それはまだ間違っています。ANSIはもともとC89(ブール型を持たない)を開発していましたが、新しい開発はISOによって行われ、ANSIはISO標準を受け入れます。そのため、現在のANSI C標準は現在のISO C標準と同じです(ブール型)。
ジェリーコフィン

8

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

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

基本的な方向については、Cは基本的に構造化手続き型プログラミングをサポートしています。C ++は、オブジェクト指向プログラミング、汎用プログラミング、メタプログラミング(コンパイル時に任意の計算を実行する)と同様にそれをサポートします。C ++ 11では、少なくとも関数プログラミングサポート(たとえば、ラムダ式)とも誤解される可能性のあるいくつかの断片が追加されます。C ++ 14にはさらにいくつかの機能が追加されていますが、それらのほとんどは、方向性の大きな変更ではなく、本当に便利です。


1

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


1
えー、継承のあるクラスはどうですか?Cでは多くのテンプレートをプリプロセッサマクロで実行できますが、これはCでは大変な作業です。
JBRウィルキンソン

4
プリプロセッサマクロはタイプセーフではありません。純粋なテキスト置換であり、デバッグも難しくなります。基本的なクラスと継承を機能させることは、Cで多くの作業ではありません。たとえば、このペーパーを参照してください:arxiv.org/abs/1003.2547
zvrba

2
私の投票は、C ++がCより優れている最も重要な機能のデストラクタになります(その優れたクリーンアップ機能のために、コンストラクタよりも優れています)。
トーマスエディング

@zvrba #define GENERATE_INTERFACE(T) T T##_func(T x);; (タイプ)Cの安全なオーバーロード/テンプレート。デストラクタはCにないはるかに重要な機能であるとThomasに同意します。しかし、デストラクタはしばしば重要なコードを隠します。私の意見では、名前空間(スコープ)が最も重要です。
YoYoYonnY
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.