29

ハンドルはオブジェクトへのポインタとどのように異なりますか?また、参照への参照を取得できないのはなぜですか?

4

4 に答える 4

52

ハンドルは通常、オブジェクトへの不透明な参照です。ハンドルのタイプは、参照される要素とは無関係です。たとえば、open()システムコールによって返されるファイル記述子について考えてみます。タイプはですintが、開いているファイルテーブルのエントリを表します。テーブルに格納されている実際のデータは、実装が互換性を維持する必要がないためintに返されたデータとは無関係です(つまり、実際のテーブルはユーザーコードに影響を与えることなく透過的にリファクタリングできます。ハンドルは、同じライブラリインターフェイスの関数でのみ使用できます。open()これにより、ハンドルを実際のオブジェクトに再マップできます。

ポインタは、メモリ内のアドレスと、そのメモリ位置にあるオブジェクトのタイプの組み合わせです。値はアドレスであり、ポインターのタイプは、そのポインターを介して実行できる操作、メモリー位置の解釈方法をコンパイラーに指示します。ポインタは、参照されるオブジェクトがポインタから存在する具象型を持っているという点で透過的です。場合によっては、ポインタがハンドルとして機能することがあることに注意してください(avoid*は完全に不透明で、空のインターフェイスへのポインタも同様に不透明です)。

参照はオブジェクトのエイリアスです。そのため、参照への参照を作成することはできません。オブジェクトに複数のエイリアスを作成することはできますが、エイリアスのエイリアスを作成することはできません。ポインタと同様に、参照が入力されます。状況によっては、参照は、使用時に自動的に逆参照されるポインターとしてコンパイラーによって実装できます。他の場合には、コンパイラーは、実際のストレージを持たない参照を持つことができます。重要な部分は、それらがオブジェクトのエイリアスであるということです。オブジェクトで初期化する必要があり、初期化後に別のオブジェクトを参照するために再装着することはできません。それらが初期化されると、参照のすべての使用は実際のオブジェクトの使用になります。

于 2012-10-23T04:16:07.497 に答える
14

「なぜ参照への参照がないのか」という質問をすることさえできます。参照が何であるかを理解していないことを意味します。

参照はオブジェクトの別名です。これ以上何もない。変数Xにオブジェクトが格納されている場合、このオブジェクトへの参照である変数Yを作成できます。どちらも同じオブジェクトについて話しているので、Yへの参照があるとはどういう意味ですか?Xへの参照はすべて同じものを参照しているため、Xへの参照と何ら変わりはありません。

C ++言語に関する限り、「ハンドル」には定義がありません。一般的に、「ハンドル」は、ある種のリソースを表す何らかの形式の構成要素です。リソースを作成するAPIから取得します。リソースの状態を照会または変更するために、ハンドルをパラメーターとして受け取る関数を呼び出します。そして、それが終わったら、他のAPI関数に渡します。

ポインタはハンドルである可能性があります。参照はハンドルである可能性があります。オブジェクトはハンドルである可能性があります。整数はハンドルである可能性があります。それはすべて、ハンドルを実装するシステムがそれをどのように処理したいかによって異なります。

于 2012-10-23T04:15:13.947 に答える
12

Ahandleは「マジッククッキー」と呼ばれることもあります。オブジェクトを識別する不透明(OPAQUE)型の値にすぎません。場合によっては、実際のポインターとして実装されるため、正しい型へのポインターにキャストすると、逆参照して、ポイントするものを操作できます。

それ以外の場合は、ポインタ以外のものとして実装されます。たとえば、そのタイプのオブジェクトのテーブルがあり、ハンドルは実際にはそのテーブルへの単なるインデックスです。テーブルのベースアドレスがわからない限り、インデックスではほとんど何もできません。

C ++は、参照への参照は不可能であると単純に言っています。「理由」の邪魔になるものはそれほど多くありません。もし彼らがひどく欲しがっていたら、間違いなくそれを許可できたはずです(さらに言えば、参照の配列も)。しかし、参照を(多く)制限することが最善であるという決定がなされたので、それが彼らがしたことです。

于 2012-10-23T04:16:38.327 に答える
6

違いはコンテキストです。

ハンドルの基本的な意味は、非常に限られたコンテキストでオブジェクトを参照することです。例えば。OSは、ユーザーまたはpidに対して20個のファイルのみを開いたままにすることができます。ポインタは、「メモリ」のコンテキストで同じオブジェクトを参照します。そして、参照はオブジェクトへの「エイリアス」です-それはソースコードのコンテキストでオブジェクトを参照します。したがって、参照への参照は、参照がすでにオブジェクトであるため存在しません。

于 2012-10-23T04:13:51.653 に答える