没有新的C ++对象
这是一个非常简单的问题,但是我好几年没有做好C ++,所以我对此有点困惑。 另外,在互联网上查找并不是最简单的事情(至less对我来说),而不是尝试。
为什么这不使用new
关键字,它是如何工作的?
基本上,这是怎么回事?
CPlayer newPlayer = CPlayer(position, attacker);
这个expression式:
CPlayer(position, attacker)
使用上面的构造函数创buildCPlayer
types的临时对象,然后:
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 = CPlayer(position, attacker);
这一行创build一个新的CPlayertypes的本地对象。 尽pipe它具有类似于function的外观,但它只是简单地调用CPlayer的构造函数。 不涉及临时或复制。 名为newPlayer的对象与其所在的范围保持一致。在此不使用new
关键字,因为C ++不是Java。
CPlayer* newPlayer = new CPlayer(position, attacker);
这一行在堆上构造一个CPlayer对象,并定义一个名为newPlayer的指针指向它。 该对象直到有人delete
它。
newPlayer不是dynamic分配的variables,而是一个自动的堆栈分配variables:
CPlayer* newPlayer = new CPlayer(pos, attacker);
不同于
CPlayer newPlayer = CPlayer(pos, attacker);
newPlayer通过正常的CPlayer(位置,攻击者)构造函数调用在堆栈上分配,虽然有些比通常冗长
CPlayer newPlayer(pos, attacker);
这和说:
int i = int(3);