Dies ist eine wirklich einfache Frage, aber ich habe C ++ jahrelang nicht richtig gemacht und bin daher ein wenig verblüfft. Außerdem ist es (zumindest für mich) nicht die einfachste Sache, im Internet nachzuschlagen, nicht es zu versuchen.
Warum wird das new
Schlüsselwort nicht verwendet und wie funktioniert es?
Was ist hier im Grunde los?
CPlayer newPlayer = CPlayer(position, attacker);
c++
new-operator
Henry B.
quelle
quelle
Das obige erstellt ein CPlayer-Objekt auf dem Stapel, daher wird es nicht benötigt
new
. Sie müssen nur verwenden,new
wenn Sie versuchen, ein CPlayer-Objekt auf dem Heap zuzuweisen. Wenn Sie die Heap-Zuordnung verwenden, sieht der Code folgendermaßen aus:CPlayer *newPlayer = new CPlayer(position, attacker);
Beachten Sie, dass wir in diesem Fall einen Zeiger auf ein CPlayer-Objekt verwenden, das durch einen übereinstimmenden Aufruf von bereinigt werden muss
delete
. Ein auf dem Stapel zugewiesenes Objekt wird automatisch zerstört, wenn es den Gültigkeitsbereich verlässt.Eigentlich wäre es einfacher und offensichtlicher gewesen zu schreiben:
CPlayer newPlayer(position, attacker);
Viele Compiler optimieren ohnehin die Version, die Sie oben gepostet haben, und es ist klarer zu lesen.
quelle
CPlayer newPlayer(position, attacker);
ist also besser, alsCPlayer newPlayer = CPlayer(position, attacker);
wenn Sie eine Stapelvariable erstellen möchten.Diese Zeile erstellt ein neues lokales Objekt vom Typ CPlayer. Trotz seines funktionsähnlichen Erscheinungsbilds wird der Konstruktor von CPlayer einfach aufgerufen. Es sind keine Provisorien oder Kopierungen erforderlich. Das Objekt mit dem Namen newPlayer lebt so lange wie der Bereich, in dem es eingeschlossen ist. Sie verwenden das
new
Schlüsselwort hier nicht, da C ++ nicht Java ist.CPlayer* newPlayer = new CPlayer(position, attacker);
Diese Zeile erstellt ein CPlayer-Objekt auf dem Heap und definiert einen Zeiger namens newPlayer, der darauf zeigt. Das Objekt lebt, bis es jemand
delete
ist.quelle
newPlayer ist keine dynamisch zugewiesene Variable, sondern eine automatisch stapelzugeordnete Variable:
CPlayer* newPlayer = new CPlayer(pos, attacker);
unterscheidet sich von
newPlayer wird auf dem Stapel über den normalen Aufruf des CPlayer-Konstruktors (Position, Angreifer) zugewiesen, wenn auch etwas ausführlich als üblich
CPlayer newPlayer(pos, attacker);
Es ist im Grunde das gleiche wie zu sagen:
int i = int(3);
quelle