2

次のシナリオを想像してください。

class ABC
{ 
  public: 
  int abc;
};

ABC& modifyABC(ABC& foo)
{
  foo.abc+=1337;
  return foo;
}

void saveABC(ABC& bar, std::vector<ABC*>& list)
{
  list.push_back(&modifyABC(bar));
}

int main()
{
  ABC foobar;
  std::vector<ABC*> ABCList;
  saveABC(foobar,ABCList);
  return 0;
}

modifyABC() は、ABC への参照を返します (これは、内部的にはある種のポインタでもあります)。& 演算子の「アドレス」は、参照のアドレスへのポインタを返しますか、それとも参照の背後にある実際のオブジェクトですか?

4

5 に答える 5

1

参照を使用して行うこと (アドレスの取得を含む) は、参照先のオブジェクトに対して行うことと同じです。C++ では、参照自体はオブジェクトではなく、必ずしもメモリ内のスペースを占有するわけではなく、アドレスもありません。

于 2013-04-12T13:26:22.767 に答える
1

modifyABC()への参照を返しますABCこれは、内部的にはある種のポインターでもあります

正確ではありません

ポインタはオブジェクト (変数) であり、何らかのストレージを必要とし、そのストレージに別のオブジェクトのメモリ内のアドレスを保持します。参照は、代替名のような純粋な別名です。理論的には、ストレージはまったく必要ありません。

C++11 標準のパラグラフ 8.3.2/4 によると:

参照がストレージを必要とするかどうかは指定されていません (3.7)。

したがって、参照へのポインターは実際には参照先オブジェクトへのポインターであり、参照に対して行われるすべての操作(初期化時にそれをオブジェクトにバインドする操作を除く)は、参照がエイリアスであるオブジェクトに対して実際に行われます

于 2013-04-12T13:24:16.267 に答える
1

あなたの質問の最後の文に苦労しています(「参照のアドレスへのポインタ」?)

言えることmodifyABC()は、 への参照を取り、ABCまったく同じ参照を返すということです。オブジェクトのコピーは作成されません。

コードの全体的な効果は、 のアドレスfoobarが に追加されることABCListです。

于 2013-04-12T13:22:14.007 に答える
1

& 演算子の「アドレス」は、参照のアドレスへのポインタを返しますか、それとも参照の背後にある実際のオブジェクトですか?

C++ では、参照自体には独自のアドレスがありません。したがって、参照のアドレスは、参照が参照しているオブジェクトのアドレスを意味します。

X x; 
X &r = x; //reference
X *p = &r; //same as &x

それが役立つことを願っています。

于 2013-04-12T13:22:37.430 に答える
0

参照とポインタは、2 つの異なる概念です。参照は、既存のオブジェクトへのエイリアスと考えることができます。したがって、エイリアスのエイリアスが元のエイリアスであるのと同じように、modifyABC() の戻り値は元のオブジェクトへの参照です。参照へのポインターを取得すると、参照しているオブジェクトのアドレスが常に返されます。

于 2013-04-12T13:22:22.560 に答える