没有新的C ++对象

这是一个非常简单的问题,但是我好几年没有做好C ++,所以我对此有点困惑。 另外,在互联网上查找并不是最简单的事情(至less对我来说),而不是尝试。

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

基本上,这是怎么回事?

 CPlayer newPlayer = CPlayer(position, attacker); 

这个expression式:

 CPlayer(position, attacker) 

使用上面的构造函数创buildCPlayertypes的临时对象,然后:

 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);