【问题标题】:How does a reference to an object work?对对象的引用如何工作?
【发布时间】:2014-04-12 05:29:38
【问题描述】:

例如在这样的函数中:

void Monster::Attack(Player& player)

此函数将位于 Monster 类的 .cpp 文件中,并使用 Player 类的标头。

新对象播放器是否可以访问嵌入到 Player 类中的所有好东西。还有为什么不能:

void Monster::Attack(Player player)

完成了吗?

【问题讨论】:

  • 我不确定你在问什么,但是当你想修改类的状态而不必取消引用指针时使用引用.. Monster 的攻击函数应该采用引用或指针,如果它正在修改玩家状态。如果你这样做Attack(Player player),那么攻击函数会获得该玩家的“副本”。
  • 存储限定符的语义已经写了一遍又一遍。我推荐一个好的谷歌搜索它们是如何工作的。它比从管道的某个地方得到相同的答案更能帮助你。
  • 这实际上是一个有用的人,所以使用引用会修改数据而不必返回任何东西?
  • 除了 CantChooseUsernames 所说的之外,每当您想要传递对象而不复制它时,都会使用引用。它基本上只不过是一个美化的不可空指针,仅此而已。无论使用引用还是指针,编译器都会发出相同的机器代码,它只是验证引用永远不能为 NULL,仅此而已。

标签: c++ class reference


【解决方案1】:

了解了优缺点后,就可以选择合适的功能了。

void Monster::Attack(Player& player);

您可以避免复制输入参数的成本。您可以修改输入对象。根据您的要求,这可能是好事也可能是坏事。

void Monster::Attack(Player player);

您会产生复制输入参数的成本。您可以在函数中修改player,但这不会更改调用函数中的对象。再说一次,这可能是好事也可能是坏事,具体取决于您的要求。

【讨论】:

  • 所以使用副本,基本上是这样的。制作对象、类和函数的副本(或任何被复制到的对象),但通过引用将原始对象传入以进行修改
【解决方案2】:

我相信引用又是内部的指针。语法与指针的语法略有不同,但在底层发生了相同的事情。您正在对原始对象进行更改。

第二个方法声明的问题是它传递player 参数不是使用指针或引用,而是作为一个实际对象。这意味着按值传递,这意味着复制。然后你对副本进行更改,会发生什么?原件保持不变,这可能不是您想要的。

【讨论】:

  • 因此,如果有些事情需要改变而不是回头使用引用或指针,那么动态的东西就会随着游戏而流动。但是,如果您只想复制运行,则类中的初始值不会在调用函数时暂时更改
  • 或者换一种说法是你改变蓝图而不是房子?
  • 不是,不是。更改蓝图类似于更改类定义。为了扩展您的房屋类比,假设您有一个在房屋上运行并更改屋顶颜色并且不通过引用/指针传递的方法。它将使用原始房屋,复制它(创建一个与原始房屋具有相同属性的新房屋),将屋顶颜色更改为绿色在副本上,然后副本在以下情况下被销毁方法返回,你留下的是原来的,它的屋顶仍然是相同的红色。
  • 因此,当您想要对对象本身进行实际更改时。当这种情况发生时,它不会进入对象的类并改变任何数据成员的值吗?或者只是为了那个对象。所以我试图从记忆的角度来理解它。因此,每个对象都存储在一个新地址,但占用的空间量与类本身相同。并且每个对象都占用一个不同的地址等等
【解决方案3】:

我的建议是首先理解引用,与函数参数的上下文分开。

这里有一些示例代码:

int a = 5;
int &b = a;

现在,ab 都是同一个变量的标签。这段代码实际上等同于:

int b = 5;
int &a = b;

您随后使用a 的任何地方,都可以使用b 代替;这条规则没有例外。关键是你可以有多个标识符来标识同一个变量。

进入函数上下文。如果你有:

int a;
foo(a);

foo(int &b)
{

那么mainafoob 都是同一个变量的标签。对foo 中的b 执行操作与对main 中的a 执行操作完全相同。它们都是同一个变量,只是名称不同。就像威廉王子和剑桥公爵是同一个人一样。

【讨论】:

  • 所以我的问题是,每个对象在内存中占用的位置是否等于类的大小,所以当你引用它时,你实际上得到了对象的地址来修改数据成员。 Vs 只是在函数的时间内修改它的副本
  • 是的。当你写一个变量名时,就是说指定一个存储区。然后取决于上下文是否从该区域检索值,或者使用其地址进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多