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 的引用(它在内部也是某种指针,AFAIK)。“地址” & 运算符现在是否返回指向引用地址或引用后面的实际对象的指针?

4

5 回答 5

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 回答
1

modifyABC()返回对ABC在内部也是某种指针 AFAIK的引用)

不完全是

指针是需要一些存储空间并在该存储空间中保存另一个对象的内存地址的对象(变量)。引用是纯别名,如替代名称。理论上,它们根本不需要任何存储空间。

根据 C++11 标准的第 8.3.2/4 段:

未指定引用是否需要存储 (3.7)。

因此,指向引用的指针实际上是指向被引用对象的指针,并且对引用执行的任何操作(除了在初始化时将其绑定到对象的行为)实际上是在引用为其别名的对象上执行的

于 2013-04-12T13:24:16.267 回答
1

您对引用所做的任何事情(包括获取其地址)都等同于对引用的对象执行此操作。在 C++ 中,引用本身不是对象,不一定占用内存空间,也没有地址。

于 2013-04-12T13:26:22.767 回答
0

引用和指针是两个不同的概念。您可能会将引用视为现有对象的别名。所以就像别名的别名又是原始的别名一样,这里 modifyABC() 的返回值又是对原始对象的引用。获取指向引用的指针始终返回您引用的对象的地址。

于 2013-04-12T13:22:22.560 回答