86

这是一个非常简单的问题,但我多年来一直没有正确完成 C++,所以我对此感到有些困惑。此外,在互联网上查找并不是最容易的事情(至少对我来说),而不是尝试。

为什么不使用new关键字,它是如何工作的?

基本上,这里发生了什么?

CPlayer newPlayer = CPlayer(position, attacker);
4

4 回答 4

74

这个表达式:

CPlayer(position, attacker)

CPlayer使用上述构造函数创建一个临时类型的对象,然后:

CPlayer newPlayer =...;

使用复制构造函数将提到的临时对象复制到newPlayer. 更好的方法是编写以下内容以避免临时性:

CPlayer newPlayer(position, attacker);
于 2009-11-19T16:59:51.150 回答
66

上面在堆栈上构造了一个 CPlayer 对象,因此它不需要new. new仅当您尝试在堆上分配 CPlayer 对象时才需要使用。如果您使用堆分配,代码将如下所示:

CPlayer *newPlayer = new CPlayer(position, attacker);

请注意,在这种情况下,我们使用了一个指向 CPlayer 对象的指针,该对象需要通过对delete. 在堆栈上分配的对象将在超出范围时自动销毁。

实际上写起来会更容易和更明显:

CPlayer newPlayer(position, attacker);

无论如何,许多编译器都会优化您发布到上面的版本,并且阅读起来更清晰。

于 2009-11-19T17:00:38.170 回答
11
CPlayer newPlayer = CPlayer(position, attacker);

这一行创建了一个新的 CPlayer 类型的本地对象。尽管它的外观类似函数,但这只是调用了 CPlayer 的构造函数。不涉及临时或复制。名为 newPlayer 的对象与它所包含的作用域一样长。此处不要使用new关键字,因为 C++ 不是 Java。

CPlayer* newPlayer = new CPlayer(position, attacker);

这一行在堆上构造了一个 CPlayer 对象,并定义了一个名为 newPlayer 的指针指向它。对象一直存在,直到有人deletes 它。

于 2009-11-19T17:40:06.107 回答
7

newPlayer 不是动态分配的变量,而是自动堆栈分配的变量:

CPlayer* newPlayer = new CPlayer(pos, attacker);

不同于

CPlayer newPlayer = CPlayer(pos, attacker);

newPlayer 是通过普通的 CPlayer(position, Attacker) 构造函数调用在堆栈上分配的,尽管比通常的要冗长一些

CPlayer newPlayer(pos, attacker);

这与说的基本相同:

int i = int(3);
于 2009-11-19T17:07:41.353 回答