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