这是一个非常简单的问题,但我多年来一直没有正确完成 C++,所以我对此感到有些困惑。此外,在互联网上查找并不是最容易的事情(至少对我来说),而不是尝试。
为什么不使用new
关键字,它是如何工作的?
基本上,这里发生了什么?
CPlayer newPlayer = CPlayer(position, attacker);
这是一个非常简单的问题,但我多年来一直没有正确完成 C++,所以我对此感到有些困惑。此外,在互联网上查找并不是最容易的事情(至少对我来说),而不是尝试。
为什么不使用new
关键字,它是如何工作的?
基本上,这里发生了什么?
CPlayer newPlayer = CPlayer(position, attacker);
这个表达式:
CPlayer(position, attacker)
CPlayer
使用上述构造函数创建一个临时类型的对象,然后:
CPlayer newPlayer =...;
使用复制构造函数将提到的临时对象复制到newPlayer
. 更好的方法是编写以下内容以避免临时性:
CPlayer newPlayer(position, attacker);
上面在堆栈上构造了一个 CPlayer 对象,因此它不需要new
. new
仅当您尝试在堆上分配 CPlayer 对象时才需要使用。如果您使用堆分配,代码将如下所示:
CPlayer *newPlayer = new CPlayer(position, attacker);
请注意,在这种情况下,我们使用了一个指向 CPlayer 对象的指针,该对象需要通过对delete
. 在堆栈上分配的对象将在超出范围时自动销毁。
实际上写起来会更容易和更明显:
CPlayer newPlayer(position, attacker);
无论如何,许多编译器都会优化您发布到上面的版本,并且阅读起来更清晰。
CPlayer newPlayer = CPlayer(position, attacker);
这一行创建了一个新的 CPlayer 类型的本地对象。尽管它的外观类似函数,但这只是调用了 CPlayer 的构造函数。不涉及临时或复制。名为 newPlayer 的对象与它所包含的作用域一样长。此处不要使用new
关键字,因为 C++ 不是 Java。
CPlayer* newPlayer = new CPlayer(position, attacker);
这一行在堆上构造了一个 CPlayer 对象,并定义了一个名为 newPlayer 的指针指向它。对象一直存在,直到有人delete
s 它。
newPlayer 不是动态分配的变量,而是自动堆栈分配的变量:
CPlayer* newPlayer = new CPlayer(pos, attacker);
不同于
CPlayer newPlayer = CPlayer(pos, attacker);
newPlayer 是通过普通的 CPlayer(position, Attacker) 构造函数调用在堆栈上分配的,尽管比通常的要冗长一些
CPlayer newPlayer(pos, attacker);
这与说的基本相同:
int i = int(3);