[解決済み] Objective-CとC++はどう違うのですか?[クローズド]
2022-04-21 09:53:24
質問
Objective-CとC++の文法、機能、パラダイム、フレームワーク、ライブラリなどの主な違いは何ですか?
*重要:私の目的は、2つの言語間のパフォーマンス戦争を始めることではありません。本当に確かな事実が知りたいだけなのです。実際、私の質問はパフォーマンスとは関係ありません。主観的に見えるものについては、ソースを示してください。
解決方法は?
主な相違点の一部を簡単にご紹介します。
- C++では多重継承が可能だが、Objective-Cではできない。
- C++とは異なり、Objective-Cではメソッドのパラメータに名前を付けることができ、メソッドのシグネチャにはパラメータの名前と型、戻り値の型のみが含まれます(下記のbbumさんとChuckさんのコメントを参照)。これに対して、C++のメンバ関数のシグネチャには、関数名だけでなく、パラメータ/戻り値の型(名前なし)だけが含まれます。
-
C++では
bool
,true
とfalse
を使用し、Objective-CではBOOL
,YES
とNO
. -
C++の使用
void*
とnullptr
であるのに対し、Objective-Cはid
とnil
. -
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: 以下のコメントで指摘された点を解決するために更新し、さらにいくつかの項目を追加しました。
関連
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cの定数
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] C++のデリゲートとは何ですか?