67 votes

Objet C ++ sans nouveau

C’est une question très simple, mais je n’ai pas correctement c ++ depuis des années et je suis donc un peu déconcerté par cela. En outre, ce n'est pas la chose la plus facile (pour moi du moins) de rechercher sur Internet, pas pour essayer.

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

Fondamentalement, que se passe-t-il ici?

 CPlayer newPlayer = CPlayer(position, attacker);
 

56voto

AraK Points 38702

Cette expression:

 CPlayer(position, attacker)
 

crée un objet temporaire de type CPlayer à l'aide du constructeur ci-dessus, puis:

 CPlayer newPlayer =...;
 

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

 CPlayer newPlayer(position, attacker);
 

48voto

Timo Geusch Points 16952

Le ci-dessus construit une CPlayer objet sur la pile, donc il n'a pas besoin d' new. Vous ne devez utiliser new si vous essayez d'attribuer une CPlayer objet sur le tas. Si vous êtes en utilisant un tas d'allocation, le code ressemblera à ceci:

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

Notez que dans ce cas, on utilise un pointeur vers une CPlayer objet qui aura besoin d'être nettoyé par un correspondant de l'appel d' delete. Un objet alloué sur la pile sera automatiquement détruite quand elle est hors de portée.

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

CPlayer newPlayer(position, attacker);

Beaucoup de compilateurs optimiser la version que vous avez posté au-dessus de toute façon et c'est plus clair à lire.

10voto

Michael Kristofik Points 16035
CPlayer newPlayer = CPlayer(position, attacker);

Cette ligne crée un nouvel objet local de type CPlayer. En dépit de sa fonction, comme l'apparence, cela appelle tout simplement CPlayer du constructeur. Aucune temporaires ou de la copie sont impliqués. L'objet nommé newPlayer vit aussi longtemps que la portée, il est enfermé dans. Vous n'utilisez pas l' new mot-clé ici parce que le C++ n'est pas Java.

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

Cette ligne génère un CPlayer objet sur le tas et définit un pointeur nommé newPlayer à point à elle. L'objet de la vie jusqu'à ce que quelqu'un deletes il.

5voto

digitalarbeiter Points 624

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

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

est différent de

 CPlayer newPlayer = CPlayer(pos, attacker);
 

newPlayer est alloué sur la pile via l'appel du constructeur normal de CPlayer (position, attaquant), bien que quelque peu prolixe que l'habituel

 CPlayer newPlayer(pos, attacker);
 

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

 int i = int(3);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X