6

どちらをいつ使用するかについてのすべての考慮事項はさておき、ポインタと参照のセマンティクスについてはまだわかりません。

今のところ、参照は本質的には宣言時に初期化する必要のあるポインターであり、それ以降は他のものを指すことができないという印象を受けています。言い換えれば、それらはType* const(ではなく)のようなものであるか、またはそれらを再装着Type const*することはできません。これは基本的に、そのオブジェクトの「新しい名前」になります。コンパイラがポインタを使って実際に参照を実装する必要はないと聞いたのですが、目に見える振る舞いに関しては、このように考えることができると思います。

しかし、なぜあなたはこのようなことをすることができないのですか?

int& foo = new int;

動的メモリへの参照を作成したいと思います。これはコンパイルされません。エラーが発生します

error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int*'

それは私には理にかなっています。new演算子は、指定されたタイプのポインタをOSのメモリアドレスに返すようです。動的に割り当てられます。

では、動的メモリへの「参照」を作成するにはどうすればよいですか?

編集:C++の参照とポインタの違いを正確に説明するリソースへのリンクをいただければ幸いです。

4

3 に答える 3

13

new割り当てられたメモリへのポインターを返すため、戻り値をポインターにキャプチャする必要があります。

割り当てが完了したら、ポインターへの参照を作成できます。

int *ptr = new int;
int* &ref = ptr;

次に、次のように使用した後に削除します。

delete ref;

またはもっと簡単に、

int &ref = *(new int);

次のように使用した後は削除します。

delete &ref;
于 2012-04-05T06:28:08.653 に答える
5

次のようなリファレンスを取得できます。

int& foo = *(new int);

一般に、から取得するT*には、ポインターを「逆参照」しますT&*

しかし、これはそもそもあまり良い考えではありません。通常、ポインターを使用して、ヒープ割り当てオブジェクトのアドレスを格納します。

于 2012-04-05T06:28:33.973 に答える
5

参照はシンタックス シュガーです。矢印ではなくドット演算子を使用してオブジェクトにアクセスできます。

ポインターまたは参照のどちらを使用するかの選択はセマンティックです。メソッドへの参照によってオブジェクトを渡すとき、またはメソッドから参照を返すときは、次のように言っていることになります: )" のような構文を提案するここの他の回答はdelete &foo;、技術的には機能するかもしれませんが、悪臭がするということになります。オブジェクトへの参照がある場合は、それを削除しないでください。あなたはそれを所有していません。最も重要なのは、参照をリセットできないため、割り当て解除されたメモリへの参照になってしまうことです。これは悪いことです

ここで、ヒープ上にオブジェクトを割り当てた場合 (それを作成するために「new」と呼ばれます)、それを所有し、後でそれをクリーンアップする責任があるため、それへのポインターを保持する必要があります。なんで?したがって、後で安全に削除して、ポインターを null にすることができます。

したがって、ポインタと参照の違いは、矢印ではなくドットを使用するという機械的な違い以外に、メソッドへの参照渡しによって、オブジェクトの使用方法について何かを示すことです。new を呼び出して参照を直接初期化することは、たとえ可能であってもナンセンスです。

于 2012-04-05T06:47:57.927 に答える