構文、機能、パラダイム、フレームワーク、ライブラリの点で、Objective-CとC ++の主な違いは何ですか?
*重要:私の目標は、2つの言語間でパフォーマンス戦争を始めることではありません。本当の難しい事実だけが欲しい。実際、私の質問はパフォーマンスとは関係ありません!主観的に見える可能性のある情報源を教えてください。
構文、機能、パラダイム、フレームワーク、ライブラリの点で、Objective-CとC ++の主な違いは何ですか?
*重要:私の目標は、2つの言語間でパフォーマンス戦争を始めることではありません。本当の難しい事実だけが欲しい。実際、私の質問はパフォーマンスとは関係ありません!主観的に見える可能性のある情報源を教えてください。
回答:
主な違いのいくつかの短いリスト:
bool
、true
およびを使用しfalse
、Objective-CはBOOL
、YES
およびを使用しNO
ます。void*
andを使用しnullptr
、Objective-Cはid
andを優先しnil
ます。SEL
、関数ポインターとほぼ同等の「セレクター」(typeを持つ)を使用します。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があなたに指摘したガイドを強くお勧めします。ちなみに、別の興味深いサイトはこれかもしれません。
また、私はObjective-Cを自分で学習し始めたばかりであることを指摘します。そのため、上記の多くは正しくないか、完全ではない可能性があります。その場合は謝罪し、改善のための提案を歓迎します。
編集:以下のコメントで指摘された点に対処するために更新され、リストにいくつかの項目が追加されました。
void*
and も使用NULL
します。オブジェクトには使用しません。Obj-Cでは任意のCスタイルのポインターを使用でき、多くのAPI呼び出しは実際に参照によって値を渡したり、返したりしますNULL
。この場合、頻繁に使用されます。
どちらもCをルーツとしていますが、2つのまったく異なる言語です。
主な違いは、Objective-Cはディスパッチの実行時の決定に重点を置いており、継承とポリモーフィズムの処理は実行時ライブラリに大きく依存しているのに対し、C ++では通常、静的でコンパイル時の決定に重点が置かれています。
ライブラリに関しては、両方の言語でプレーンCライブラリを使用できますが、それらのネイティブライブラリは完全に異なります。
興味深いのは、両方の言語を混在させることができることです(いくつか制限があります)。結果はObjective-C ++と呼ばれます。
それらは完全に異なります。Objective Cは、C ++よりもSmalltalkと共通しています(まあ、構文を除いて)。
他の人が言ったように、Objective-Cは、C ++のかなり静的なレルムと比較して、オブジェクトの考え方の点ではるかに動的です。
オブジェクト指向言語のSmalltalk系列にあるObjective-Cには、Java、Python、およびその他の「標準」の非C ++オブジェクト指向言語と非常によく似たオブジェクトの概念があります。多くの動的ディスパッチ、オペレーターの過負荷なし、メッセージの送信。
C ++はそれ自体が奇妙な動物です。それは主に家系図のSmalltalk部分をスキップしました。いくつかの点で、オブジェクト指向プログラミングに使用できる継承をサポートする優れたモジュールシステムがあります。物事ははるかに静的です(たとえば、オーバーライド可能なメソッドはデフォルトではありません)。
Objective-Cは、Cのより完全なスーパーセットです。CおよびObjective-Cでは、void*
からstructポインターへの暗黙的なキャストが許可されています。
Foo* bar = malloc(sizeof(Foo));
void
ポインターが明示的にキャストされない限り、C ++はコンパイルされません。
Foo* bar = (Foo*)malloc(sizeof(Foo));
これと毎日のプログラミングの関連性はゼロであり、ただの面白い雑学です。
Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));
多分インプレースコンストラクタを使用..しかし、今日のように、その近代的なC ++はもっと似ているauto bar = new Foo(constructorArg);
あなたが必要とのmallocいけないし、どちらかcallicは、あなたが使用することができ、実際にstd::vector::reserve
、そしてstd::vector::emplace_mack
Obj-Cは、言語自体ではるかに動的な機能を備えていますが、C ++は、いくつかの動的な機能を備えたコンパイル時の機能に重点を置いています。
では、C ++パラメトリックポリモーフィズムはコンパイル時にチェックされますが、Obj-Cでは、パラメトリックポリモーフィズムは動的ディスパッチによって実現され、コンパイル時にチェックされません。
Obj-Cは本質的に非常に動的です。実行時にクラスにメソッドを追加できます。また、クラスを調べるために実行時に内省があります。C ++では、クラスの定義は変更できません。すべてのイントロスペクションはコンパイル時に行う必要があります。Obj-Cの動的な性質は、関数のマップ(またはそのようなもの)を使用してC ++で実現できますが、それでもObj-Cよりも詳細です。
C ++では、コンパイル時に実行できるチェックがさらに多くあります。たとえば、異型(ユニオンなど)を使用すると、コンパイラはすべてのケースが記述または処理されるように強制できます。したがって、問題のエッジケースを処理することを忘れないでください。ただし、これらのチェックはすべて、コンパイル時にコストがかかります。Obj-Cは、C ++よりもコンパイルがはるかに高速です。