構文、機能、パラダイム、フレームワーク、ライブラリに関して、Objective-CとC++の主な違いは何ですか?
*重要:私の目標は、2つの言語間でパフォーマンス戦争を開始することではありません。本当に難しい事実だけが欲しい。実際、私の質問はパフォーマンスとは関係ありません!主観的と思われるもののソースを提供してください。
主な違いのいくつかの短いリスト:
bool
、true
およびfalse
を使用し、Objective-CはBOOL
、YES
およびNO
を使用します。void*
とnullptr
を使用しますが、Objective-Cはid
とnil
を優先します。SEL
)を使用します。nil
のメンバー関数を呼び出そうとするとクラッシュするC++とは異なり、nullptr
にメッセージを送信できます。self
に割り当てることができ、クラス初期化子(コンストラクターに類似)が必要に応じてまったく異なるクラスを返すことができます。 C++とは対照的に、クラスの新しいインスタンスを(暗黙的にスタック上で、またはnew
を介して明示的に)作成すると、最初に指定した型であることが保証されます。int foo (void)
およびint foo (int)
では、メソッドfoo
の暗黙的なオーバーロードを定義しますが、Objective-Cで同じことを実現するには、明示的なオーバーロード- (int) foo
および- (int) foo:(int) intParam
が必要です。これは、Objective-Cの名前付きパラメーターがC++の名前マングリングと機能的に同等であるためです。alloc
メッセージで明示的に、または暗黙的に適切なファクトリメソッドで)割り当てる必要があります。私の意見では、おそらく最大の違いは構文です。基本的にどちらの言語でも同じことを達成できますが、私の意見では、C++構文は単純ですが、Objective-Cの機能の一部は動的ディスパッチにより特定のタスク(GUIデザインなど)を簡単にします。
おそらく私が見逃した他の多くのことも、私は私が考える他のことで更新します。それ以外にも、LiraNunaがあなたに指摘したガイドを強くお勧めします。ちなみに、関心のある別のサイトは this かもしれません。
また、Objective-Cを自分で学習し始めたばかりであることを指摘する必要があります。上記の多くは完全に正確または完全ではない可能性があります。その場合はおaび申し上げます。
編集:以下のコメントで指摘された点に対処するために更新され、リストにいくつかの項目が追加されました。
どちらもCに根ざしていますが、2つの完全に異なる言語です。
主な違いは、Objective-Cはディスパッチのランタイム決定に焦点を当てており、継承とポリモーフィズムを処理するランタイムライブラリに大きく依存しているのに対し、C++では通常、静的なコンパイル時間の決定に焦点が当てられています。
ライブラリについては、両方の言語でプレーンCライブラリを使用できますが、ネイティブライブラリは完全に異なります。
興味深いのは、両方の言語を混在させることができることです(いくつかの制限があります)。結果は Objective-C++ と呼ばれます。
それらは完全に異なっています。 Objective Cには、C++よりもSmalltalkとの共通点が多くあります(実際、構文を除いて)。
私の頭の上から:
私にとって、最大の違いはモデルシステムです。 Obj-Cを使用すると、メッセージングとイントロスペクションを実行できますが、C++には非常に強力なテンプレートがあります。
それぞれに長所があります。
他の人が言ったように、Objective-Cは、オブジェクトに対する考え方とC++のかなり静的なレルムの点ではるかに動的です。
オブジェクト指向言語のSmalltalk系列であるObjective-Cは、Java、Python、およびその他の「標準」の非C++オブジェクト指向言語の概念と非常に類似したオブジェクトの概念を持っています。動的なディスパッチが多く、オペレーターのオーバーロードはなく、メッセージを送信します。
C++はそれ自体が奇妙な動物です。家系図のSmalltalk部分はほとんどスキップされました。いくつかの点で、オブジェクト指向プログラミングに使用できる継承をサポートする優れたモジュールシステムがあります。物事はずっと静的です(たとえば、オーバーライド可能なメソッドはデフォルトではありません)。
Objective-Cは、Cのより完全なスーパーセットです。CおよびObjective-Cでは、void*
から構造体ポインターへの暗黙的なキャストが許可されています。
Foo* bar = malloc(sizeof(Foo));
void
ポインターが明示的にキャストされない限り、C++はコンパイルされません。
Foo* bar = (Foo*)malloc(sizeof(Foo));
これと毎日のプログラミングとの関連性はゼロであり、単なる雑学の事実です。
Obj-Cは、言語自体にはるかに動的な機能を備えていますが、C++は、いくつかの動的な機能を備えたコンパイル時機能に重点を置いています。
では、C++のパラメトリック多相性はコンパイル時にチェックされますが、Obj-Cでは、パラメトリック多相性は動的ディスパッチによって達成され、コンパイル時にはチェックされません。
Obj-Cは本質的に非常に動的です。実行時にクラスにメソッドを追加できます。また、クラスを見るために実行時に内省します。 C++では、クラスの定義は変更できず、すべてのイントロスペクションはコンパイル時に実行する必要があります。 Obj-Cの動的な性質は、関数のマップ(またはそのようなもの)を使用してC++で実現できますが、Obj-Cよりも冗長です。
C++では、コンパイル時に実行できるチェックがはるかに多くあります。たとえば、バリアント型(ユニオンなど)を使用すると、コンパイラはすべてのケースが記述または処理されるように強制できます。したがって、問題のEdgeケースを処理することを忘れないでください。ただし、これらのチェックはすべてコンパイル時に代価がかかります。 Obj-Cは、C++よりもコンパイルがはるかに高速です。