对对象的引用如何工作
How does a reference to an object work?
例如在这样的函数中:
void Monster::Attack(Player& player)
此函数将位于 Monster 类的.cpp文件中,并使用 Player 类的标头。
新的对象播放器是否可以访问嵌入到 Player 类中的所有好东西。还有为什么不能:
void Monster::Attack(Player player)
做完了?
了解优
缺点后,您可以选择适当的功能。
跟
void Monster::Attack(Player& player);
您可以避免复制输入参数的成本。您可以修改输入对象。根据您的要求,这可能是一件好事或一件坏事。
跟
void Monster::Attack(Player player);
您会产生创建输入参数副本的成本。您可以修改函数中的player
,但这不会更改调用函数中的对象。再一次,根据您的要求,这可能是一件好事或一件坏事。
我相信
参考文献再次成为内部指针。语法与指针的语法略有不同,但在引擎盖下会发生同样的事情。您正在对原始对象进行更改。
第二个方法声明的问题在于,它不使用指针或引用传递 player
参数,而是作为实际对象传递。这意味着按值传递,这意味着要创建副本。然后您对副本进行更改,会发生什么?原件保持不变,这可能不是您想要的。
我的建议是首先理解引用,与函数参数的上下文分开。
下面是一些示例代码:
int a = 5;
int &b = a;
现在,a
和 b
都是同一变量的标签。此代码实际上与以下内容相同:
int b = 5;
int &a = b;
在随后使用 a
的任何地方,都可以改用b
;此规则没有例外。关键点是,您可以有多个标识符来标识同一变量。
转到函数上下文。如果您有:
int a;
foo(a);
和
foo(int &b)
{
则main
的a
和foo
的b
都是同一变量的标签。在foo
对b
进行操作与在main
中对a
进行操作完全相同。它们都是相同的变量,只是名称不同。 就像威廉王子和剑桥公爵是同一个人一样。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个