1. ホーム
  2. c++

[解決済み] Objective-CとC++はどう違うのですか?[クローズド]

2022-04-21 09:53:24

質問

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

*重要:私の目的は、2つの言語間のパフォーマンス戦争を始めることではありません。本当に確かな事実が知りたいだけなのです。実際、私の質問はパフォーマンスとは関係ありません。主観的に見えるものについては、ソースを示してください。

解決方法は?

主な相違点の一部を簡単にご紹介します。

  • C++では多重継承が可能だが、Objective-Cではできない。
  • C++とは異なり、Objective-Cではメソッドのパラメータに名前を付けることができ、メソッドのシグネチャにはパラメータの名前と型、戻り値の型のみが含まれます(下記のbbumさんとChuckさんのコメントを参照)。これに対して、C++のメンバ関数のシグネチャには、関数名だけでなく、パラメータ/戻り値の型(名前なし)だけが含まれます。
  • C++では bool , truefalse を使用し、Objective-Cでは BOOL , YESNO .
  • C++の使用 void*nullptr であるのに対し、Objective-Cは idnil .
  • Objective-Cでは、セレクタを使用します。 SEL ) は、関数ポインタとほぼ等価である。
  • Objective-C はメッセージングパラダイム (Smalltalk のようなもの) を使用しており、メソッド/セレクタを通してオブジェクトに "メッセージ" を送ることができます。
  • Objective-Cは、喜んでメッセージを nil のメンバ関数を呼び出そうとするとクラッシュする C++ とは異なります。 nullptr
  • Objective-Cでは動的ディスパッチが可能で、メッセージに応答するクラスを実行時に決定することができます。C++ではメソッドが呼び出されるオブジェクトをコンパイル時に知っていなければなりません(下記のwilhelmtellのコメント参照)。この点は、先ほどの指摘と関連しています。
  • Objective-Cでは、"property"を使ってメンバ変数に対するアクセサを自動生成することができます。
  • 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が関数ポインタの代わりにセレクタを使用しているため、メソッド名が実際にはquot;value"を持たないことと関係があるのではないかと想像しています。
  • Objective-Cではオブジェクトをスタック上に作成することはできません。すべてのオブジェクトはヒープから割り当てる必要があります(明示的に alloc メッセージ、または適切なファクトリーメソッドで暗黙的に)。
  • C++と同様に、Objective-Cにも構造体とクラスがあります。しかし、C++ではこれらはほとんど同じものとして扱われますが、Objective-Cでは全く異なるものとして扱われます。 できる 例えば、スタック上に構造体を作成します。

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

その他にも見落としがたくさんあると思うので、思いついたらまた更新します。それ以外では、LiraNunaさんが紹介しているガイドを強くお勧めします。ちなみに、他のサイトとして、以下のサイトがあります。 これ .

また、私自身はObjective-Cを学び始めたばかりなので、上記の多くは正確でなく、完全でないかもしれないことを指摘しておきます。

EDIT: 以下のコメントで指摘された点を解決するために更新し、さらにいくつかの項目を追加しました。