web-dev-qa-db-fra.com

Objet C ++ sans nouveau

c'est une question vraiment simple mais je n'ai pas fait le c ++ correctement depuis des années et donc je suis un peu déconcerté par cela. De plus, ce n'est pas la chose la plus facile (du moins pour moi) de chercher sur Internet, pas pour essayer.

Pourquoi cela n'utilise-t-il pas le mot clé new et comment cela fonctionne-t-il?

Fondamentalement, que se passe-t-il ici?

CPlayer newPlayer = CPlayer(position, attacker);
63
Henry B

Cette expression:

CPlayer(position, attacker)

crée un objet temporaire de type CPlayer en utilisant le constructeur ci-dessus, puis:

CPlayer newPlayer =...;

L'objet temporaire mentionné est copié à l'aide du constructeur de copie dans newPlayer. Une meilleure façon consiste à écrire ce qui suit pour éviter les temporaires:

CPlayer newPlayer(position, attacker);
53
AraK

Ce qui précède construit un objet CPlayer sur la pile, il n'a donc pas besoin de new. Vous devez uniquement utiliser new si vous essayez d'allouer un objet CPlayer sur le tas. Si vous utilisez l'allocation de tas, le code ressemblerait à ceci:

CPlayer *newPlayer = new CPlayer(position, attacker);

Notez que dans ce cas, nous utilisons un pointeur vers un objet CPlayer qui devra être nettoyé par un appel correspondant à delete. Un objet alloué sur la pile sera détruit automatiquement lorsqu'il sortira du cadre.

En fait, il aurait été plus facile et plus évident d'écrire:

CPlayer newPlayer(position, attacker);

De nombreux compilateurs optimiseront de toute façon la version que vous avez publiée ci-dessus et c'est plus clair à lire.

42
Timo Geusch
CPlayer newPlayer = CPlayer(position, attacker);

Cette ligne crée un nouvel objet local de type CPlayer. Malgré son apparence de fonction, cela appelle simplement le constructeur de CPlayer. Aucune copie temporaire ou copie n'est impliquée. L'objet nommé newPlayer vit aussi longtemps que l'étendue dans laquelle il est enfermé. Vous n'utilisez pas le mot clé new ici car C++ n'est pas Java.

CPlayer* newPlayer = new CPlayer(position, attacker);

Cette ligne construit un objet CPlayer sur le tas et définit un pointeur nommé newPlayer pour le pointer. L'objet vit jusqu'à ce que quelqu'un deletes le.

9
Michael Kristofik

newPlayer n'est pas une variable allouée dynamiquement mais une variable auto-allouée à la pile:

CPlayer* newPlayer = new CPlayer(pos, attacker);

est différent de

CPlayer newPlayer = CPlayer(pos, attacker);

newPlayer est alloué sur la pile via l'invocation normale du constructeur CPlayer (position, attaquant), bien que quelque peu verbeuse que d'habitude

CPlayer newPlayer(pos, attacker);

C'est essentiellement la même chose que de dire:

int i = int(3);
5
digitalarbeiter