2010-12-06 10 views
0

私はOOPの新人ではありませんが、変数が(C++、java、phpのように)オブジェクト全体を保持できないのはなぜか分かりません。だから、いつもポインタを使って作業することの利点は何ですか? 変数はオブジェクト自体ではなくオブジェクトへの参照を格納するのはなぜですか?

+4

C++ *の変数はオブジェクト全体を保持できます。 Javaの変数はできません。 C#の変数は、クラスが 'System.ValueType'から継承する場合にのみオブジェクトを保持できます。 – cdhowie

答えて

1

自動対手動メモリ管理になります。 Javaや.NETのようなプラットフォームは、garbage collectorを実装する仮想マシン上で動作します。これはメモリの割り当てと破壊を自動的に管理します。これらのシステムでは、すべての変数は単一のベースであるObjectタイプから派生しています。

C++ は、オブジェクトインスタンスをスタックに格納する(つまり、ポインタとヒープに割り当てられない)ことができます。対照的に、C++には基本型を拡張しない多くのプリミティブ型(int,floatなど)があります。

+0

zourtneyはこう述べています。「これらのシステムでは、すべての変数が単一の基本Object型から派生しています。これは混乱する可能性があります。 .NETでは、値型は最終的にObjectから継承されますが、その内容は「参照」ではなくスタックに格納されます。 –

1

点は、メモリ管理である...私はちょうどここに学ぶためにしようとしている、ありがとうございました。ポインターを使うことで、あなたのプログラムは、それが指す変数のコピーを常に作るわけではありません。

Why C Pointers

+0

http://stackoverflow.com/questions/162941/why-use-pointers –

2

これは、OOPの要件ではありません。コンテンツ自体ではなく、いくつかの型への参照を格納する方が効率的です。複雑なオブジェクトを渡すのは非常に面倒ですが、オブジェクトの参照やアドレスを渡すだけでは非常に効率的です。ほとんどのプログラミング言語は、これらの概念の両方(値型と参照型)をサポートしています(Javaの作成者は、すべてがオブジェクトから継承することを選択します)。

.NETのような多くのプラットフォームは、軽量のオブジェクトのような種類の構造体を提供します。彼らは継承をサポートしていませんが、メンバーが多いかなり複雑な構造を持つことができます。構造体は複雑なデータ型をサポートしていても、値型です。もちろん、構造体が複雑すぎると効率が悪くなり、クラスを作るほうがよいでしょう。

+0

「Javaの作成者はすべてがオブジェクトから継承されることを選択する」という部分を理解できませんでした。 Objectクラスではありませんか? – fabio

+0

@ user532722はい。したがって、すべての型は参照を使用して終了します。 –

関連する問題