Objective-CとC ++の違いは何ですか?[閉まっている]


171

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

*重要:私の目標は、2つの言語間でパフォーマンス戦争を始めることではありません。本当の難しい事実だけが欲しい。実際、私の質問はパフォーマンスとは関係ありません!主観的に見える可能性のある情報源を教えてください。


2
このガイドは、私が見た中で最高の比較を提供します。
LiraNuna 2010年

@Oskar Kjellin:MacとLiraNunaの答えはどちらもすばらしい答えです。どちらもお互いの答えを補完するため、どちらが最適かを客観的に判断することはできません。
警戒態勢の

@Alertyはよく知っています(かなり頻繁に自分に出会います)。おそらく、一番上を回答済みとしてマークするだけです。これは、決定できないときに行うことです。回答済みとマークされていない質問がある場合、私は気に入らない:(
Oskar Kjellin 2010

1
最初の回答に2番目の回答へのリンクを入れ、その逆/その逆
Lee Taylor

回答:


185

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

  • C ++では多重継承が可能ですが、Objective-Cではできません。
  • C ++とは異なり、Objective-Cではメソッドパラメータに名前を付けることができ、メソッドシグネチャには、パラメータの名前と型、および戻り値の型のみが含まれます(以下のbbumおよびChuckのコメントを参照)。対照的に、C ++メンバー関数のシグネチャには、関数名だけでなく、パラメーター/戻り値の型(名前なし)も含まれます。
  • C ++はbooltrueおよびを使用しfalse、Objective-CはBOOLYESおよびを使用しNOます。
  • C ++はvoid*andを使用しnullptr、Objective-Cはidandを優先しnilます。
  • Objective-CはSEL、関数ポインターとほぼ同等の「セレクター」(typeを持つ)を使用します。
  • Objective-Cはメッセージングパラダイム(Smalltalkの1つ)を使用しており、メソッド/セレクターを介して「メッセージ」をオブジェクトに送信できます。
  • 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ではまったく異なる処理が行われます。たとえば、スタック上に構造体を作成できます。

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

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

また、私はObjective-Cを自分で学習し始めたばかりであることを指摘します。そのため、上記の多くは正しくないか、完全ではない可能性があります。その場合は謝罪し、改善のための提案を歓迎します。

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


8
まともなリスト。1つの修正。これらは「名前付きパラメーター」ではなく、「インターリーブパラメーター」です。名前付きの「キーワード引数」は、メソッド名の一部が省略される可能性があると考える混乱を招きます。できない。
bbum

7
最も重要な違いを見つけるのを忘れていました。Object-Cは動的ディスパッチを使用しているのに対し、C ++は静的ディスパッチを使用しています。つまり、Objective-Cコンパイラーによってコンパイルされたコードには、実行時に決定されたメッセージに応答するクラスがあります。C ++コンパイラによってコンパイルされたコードには、この情報が計算され、コンパイル時にコンパイルされます。
ヴィルヘルムテル

9
@wilhelmtell:C ++コンパイラはコンパイル時にスーパークラスのみを認識します。実行時には、実際のクラスは子孫になる可能性があります。これも動的ディスパッチの形式ですが、Objective Cで使用される形式とは異なります。これらの技術用語に注意してください!
ノーマンラムジー

5
+1良いリスト。ただし、Objective-Cではvoid*and も使用NULLします。オブジェクトには使用しません。Obj-Cでは任意のCスタイルのポインターを使用でき、多くのAPI呼び出しは実際に参照によって値を渡したり、返したりしますNULL。この場合、頻繁に使用されます。
Quinn Taylor

3
@wilhelmtell-Objective-Cについては何も知りませんが、C ++では関数呼び出しに異なるクラスを動的に応答させることができますが、基本クラスへのポインターの配列のようなものが必要で、次にACTUALクラスが必要です。それらから「ぶら下がっています」。すべてのクラスはサブクラスである必要がありますが、メソッド呼び出しは、実行時にクラスに応じて異なるメソッドを呼び出します。
ケビンアンダーソン

33

どちらもCをルーツとしていますが、2つのまったく異なる言語です。

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

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

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


更新されたリンク:Objective-C ++
IcyIcicle


6

私の頭の上から:

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

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

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


5

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

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

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


4

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

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

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

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

これと毎日のプログラミングの関連性はゼロであり、ただの面白い雑学です。


2番目の例はC ++コードではありません。C ++コンパイラでコンパイルしようとしたときにエラーが発生したのはCコードです。あなたは、元の近くに古いC ++をしたい場合は、書きたいFoo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));多分インプレースコンストラクタを使用..しかし、今日のように、その近代的なC ++はもっと似ているauto bar = new Foo(constructorArg);あなたが必要とのmallocいけないし、どちらかcallicは、あなたが使用することができ、実際にstd::vector::reserve、そしてstd::vector::emplace_mack
xakepp35

3

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

では、C ++パラメトリックポリモーフィズムはコンパイル時にチェックされますが、Obj-Cでは、パラメトリックポリモーフィズムは動的ディスパッチによって実現され、コンパイル時にチェックされません。

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

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


3
価格について話そうとするなら、公平になってください!逆に、Obj-Cは、実行時の動的メソッド呼び出しの解決がC ++よりもはるかに遅くなります。そして、コンパイル速度はランタイム速度に比べて比較的些細なことだと私は主張します。Obj-Cはより動的なディスパッチにより多くの利点を提供すると確信していますが、そこにはトレードオフがあります。
underscore_d

1
確かに、ランタイムとコンパイル時間のコストの間にはトレードオフがあります。ただし、コンパイル時間は必ずしも簡単ではありません。C ++で重いメタプログラミングとEDSLライブラリ(Boost.Spiritなど)を使用すると、実行時に非常に高速なコードを生成しながら、コンパイル時間に大きな影響を与える可能性があります。
Paul Fultz II、2016

1
確かに、私は単純なコードベースのPOVに比べて単純化しすぎていました...非常に複雑なコードベースでは、小さな変更をテストするために再コンパイルすると、開発が非常に退屈になる可能性があります。しかし、これは実際に2つを比較できるものでしょうか。そのようなライブラリは、C ++コンパイル時機能に依存しているため、Objective-Cで何らかの形で再考され、コンパイルが高速になることが示されていますか?つまり、「Obj-CはC ++よりもコンパイルがはるかに速い」という記述は、レプリケート可能なスピードアップを測定できる同等のコードベースを参照していますか?それ以外の場合は、リンゴとオレンジの栽培にかかる時間を比較します。
underscore_d
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.