web-dev-qa-db-ja.com

Objective-CとC ++の違いは何ですか?

構文、機能、パラダイム、フレームワーク、ライブラリに関して、Objective-CとC++の主な違いは何ですか?

*重要:私の目標は、2つの言語間でパフォーマンス戦争を開始することではありません。本当に難しい事実だけが欲しい。実際、私の質問はパフォーマンスとは関係ありません!主観的と思われるもののソースを提供してください。

161
Alerty

主な違いのいくつかの短いリスト:

  • C++は多重継承を許可しますが、Objective-Cは許可しません。
  • C++とは異なり、Objective-Cではメソッドパラメーターに名前を付けることができ、メソッドシグネチャにはパラメーターの名前と型、および戻り値の型のみが含まれます(以下のbbumおよびChuckのコメントを参照)。これに対して、C++メンバー関数シグネチャには、関数名とパラメーター/戻り値の型のみ(名前なし)が含まれます。
  • C++はbooltrueおよびfalseを使用し、Objective-CはBOOLYESおよびNOを使用します。
  • C++はvoid*nullptrを使用しますが、Objective-Cはidnilを優先します。
  • Objective-Cは、関数ポインターとほぼ同等の「セレクター」(タイプSEL)を使用します。
  • Objective-Cは、メソッド/セレクターを介してオブジェクトに「メッセージ」を送信できるメッセージングパラダイム(Smalltalk)を使用します。
  • Objective-Cでは、nilのメンバー関数を呼び出そうとするとクラッシュするC++とは異なり、nullptrにメッセージを送信できます。
  • Objective-Cは動的なディスパッチを可能にし、メソッドが呼び出されるオブジェクトがコンパイル時に認識される必要があるC++とは異なり、実行時にメッセージに応答するクラスを決定できます(以下のwilhelmtellのコメントを参照)。これは前のポイントに関連しています。
  • Objective-Cでは、「プロパティ」を使用してメンバー変数のアクセサーを自動生成できます。
  • Objective-Cでは、selfに割り当てることができ、クラス初期化子(コンストラクターに類似)が必要に応じてまったく異なるクラスを返すことができます。 C++とは対照的に、クラスの新しいインスタンスを(暗黙的にスタック上で、またはnewを介して明示的に)作成すると、最初に指定した型であることが保証されます。
  • 同様に、Objective-Cでは、他のクラスも実行時にターゲットクラスを動的に変更してメソッド呼び出しをインターセプトする場合があります。
  • Objective-Cには、C++の名前空間機能がありません。
  • Objective-Cには、C++参照に相当するものがありません。
  • Objective-Cにはテンプレートがなく、(たとえば)代わりにコンテナでの弱い入力を許可します。
  • Objective-Cでは、暗黙的なメソッドのオーバーロードは許可されていませんが、C++では許可されています。つまり、C++のint foo (void)およびint foo (int)では、メソッドfooの暗黙的なオーバーロードを定義しますが、Objective-Cで同じことを実現するには、明示的なオーバーロード- (int) fooおよび- (int) foo:(int) intParamが必要です。これは、Objective-Cの名前付きパラメーターがC++の名前マングリングと機能的に同等であるためです。
  • Objective-Cは、通常は適合するC++とは異なり、メソッドと変数が同じ名前を共有できるようにします。これは、関数ポインターの代わりにセレクターを使用するObjective-Cと関係があるため、メソッド名に実際には「値」がないことを想像します。
  • Objective-Cでは、オブジェクトをスタック上に作成することはできません。すべてのオブジェクトは、ヒープから(allocメッセージで明示的に、または暗黙的に適切なファクトリメソッドで)割り当てる必要があります。
  • C++と同様に、Objective-Cには構造体とクラスの両方があります。ただし、C++ではほとんど同じように扱われますが、Objective-Cでは大きく異なって扱われます-あなたはcanスタック上に構造体を作成し、例えば。

私の意見では、おそらく最大の違いは構文です。基本的にどちらの言語でも同じことを達成できますが、私の意見では、C++構文は単純ですが、Objective-Cの機能の一部は動的ディスパッチにより特定のタスク(GUIデザインなど)を簡単にします。

おそらく私が見逃した他の多くのことも、私は私が考える他のことで更新します。それ以外にも、LiraNunaがあなたに指摘したガイドを強くお勧めします。ちなみに、関心のある別のサイトは this かもしれません。

また、Objective-Cを自分で学習し始めたばかりであることを指摘する必要があります。上記の多くは完全に正確または完全ではない可能性があります。その場合はおaび申し上げます。

編集:以下のコメントで指摘された点に対処するために更新され、リストにいくつかの項目が追加されました。

174
Mac

どちらもCに根ざしていますが、2つの完全に異なる言語です。

主な違いは、Objective-Cはディスパッチのランタイム決定に焦点を当てており、継承とポリモーフィズムを処理するランタイムライブラリに大きく依存しているのに対し、C++では通常、静的なコンパイル時間の決定に焦点が当てられています。

ライブラリについては、両方の言語でプレーンCライブラリを使用できますが、ネイティブライブラリは完全に異なります。

興味深いのは、両方の言語を混在させることができることです(いくつかの制限があります)。結果は Objective-C++ と呼ばれます。

31
Georg Fritzsche

それらは完全に異なっています。 Objective Cには、C++よりもSmalltalkとの共通点が多くあります(実際、構文を除いて)。

7
Dean Harding

私の頭の上から:

  1. スタイル-Obj-Cは動的で、C++は通常静的です
  2. どちらもOOPですが、ソリューションが異なると確信しています。
  3. 異なるオブジェクトモデル(C++は、コンパイル時の型システムによって制限されます)。

私にとって、最大の違いはモデルシステムです。 Obj-Cを使用すると、メッセージングとイントロスペクションを実行できますが、C++には非常に強力なテンプレートがあります。

それぞれに長所があります。

7
Rev316

他の人が言ったように、Objective-Cは、オブジェクトに対する考え方とC++のかなり静的なレルムの点ではるかに動的です。

オブジェクト指向言語のSmalltalk系列であるObjective-Cは、Java、Python、およびその他の「標準」の非C++オブジェクト指向言語の概念と非常に類似したオブジェクトの概念を持っています。動的なディスパッチが多く、オペレーターのオーバーロードはなく、メッセージを送信します。

C++はそれ自体が奇妙な動物です。家系図のSmalltalk部分はほとんどスキップされました。いくつかの点で、オブジェクト指向プログラミングに使用できる継承をサポートする優れたモジュールシステムがあります。物事はずっと静的です(たとえば、オーバーライド可能なメソッドはデフォルトではありません)。

6

Objective-Cは、Cのより完全なスーパーセットです。CおよびObjective-Cでは、void*から構造体ポインターへの暗黙的なキャストが許可されています。

Foo* bar = malloc(sizeof(Foo));

voidポインターが明示的にキャストされない限り、C++はコンパイルされません。

Foo* bar = (Foo*)malloc(sizeof(Foo));

これと毎日のプログラミングとの関連性はゼロであり、単なる雑学の事実です。

5
Igor Zevaka

Obj-Cは、言語自体にはるかに動的な機能を備えていますが、C++は、いくつかの動的な機能を備えたコンパイル時機能に重点を置いています。

では、C++のパラメトリック多相性はコンパイル時にチェックされますが、Obj-Cでは、パラメトリック多相性は動的ディスパッチによって達成され、コンパイル時にはチェックされません。

Obj-Cは本質的に非常に動的です。実行時にクラスにメソッドを追加できます。また、クラスを見るために実行時に内省します。 C++では、クラスの定義は変更できず、すべてのイントロスペクションはコンパイル時に実行する必要があります。 Obj-Cの動的な性質は、関数のマップ(またはそのようなもの)を使用してC++で実現できますが、Obj-Cよりも冗長です。

C++では、コンパイル時に実行できるチェックがはるかに多くあります。たとえば、バリアント型(ユニオンなど)を使用すると、コンパイラはすべてのケースが記述または処理されるように強制できます。したがって、問題のEdgeケースを処理することを忘れないでください。ただし、これらのチェックはすべてコンパイル時に代価がかかります。 Obj-Cは、C++よりもコンパイルがはるかに高速です。

4
Paul Fultz II