这是一个非常简单的问题,但是我好几年都没有正确地完成c ++的工作,所以对此我感到有些困惑。另外,在互联网上查找(而不是尝试)不是最简单的事情(至少对我而言)。
为什么不使用new
关键字,它如何工作?
基本上,这是怎么回事?
CPlayer newPlayer = CPlayer(position, attacker);
Answers:
该表达式:
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(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的指针指向该对象。该对象一直存在,直到有人抓到为止delete
。
newPlayer不是动态分配的变量,而是自动的,堆栈分配的变量:
CPlayer* newPlayer = new CPlayer(pos, attacker);
与...不同
CPlayer newPlayer = CPlayer(pos, attacker);
newPlayer是通过常规CPlayer(position,Attacker)构造函数调用在堆栈上分配的,尽管比通常情况有些冗长
CPlayer newPlayer(pos, attacker);
基本上与说相同:
int i = int(3);