2009-11-19 17 views
50

esta es una pregunta realmente simple pero no he hecho C++ correctamente durante años y estoy un poco desconcertado por esto. Además, no es lo más fácil (al menos para mí) buscar en Internet, no por intentarlo.C++ Objeto sin nuevo

¿Por qué no utiliza la palabra clave new y cómo funciona?

Básicamente, ¿qué está pasando aquí?

CPlayer newPlayer = CPlayer(position, attacker); 

Respuesta

42

Esta expresión:

CPlayer(position, attacker) 

crea un objeto temporal del tipo CPlayer utilizando el constructor anterior, entonces:

CPlayer newPlayer =...; 

El mencionado objeto temporal se copia utilizando el constructor copia a newPlayer . Una mejor manera es escribir la siguiente para evitar provisionales:

CPlayer newPlayer(position, attacker); 
+0

Brillante, gracias. –

+5

En realidad, el compilador probablemente lo optimice. En ese caso, no se llamará al constructor de copias. http://stackoverflow.com/questions/1758142/why-copy-constructor-is-not-called-in-this-case – BostonLogan

+4

Una asignación en una declaración no es menos eficiente que usar la sintaxis del constructor. Si hubieran sido declaraciones separadas, entonces el comentario sobre los temporales sería correcto. La esencia es que esto declara un CPlayer (generalmente en la pila) en lugar de asignarle espacio desde la tienda gratuita (montón). –

31

Lo anterior construye un objeto CPlayer en la pila, por lo tanto, no necesita new. Solo necesita usar new si está tratando de asignar un objeto CPlayer en el montón. Si está utilizando asignación del montón, el código se vería así:

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

en cuenta que en este caso estamos usando un puntero a un objeto CPlayer que tendrá que ser limpiado por una llamada a juego para delete . Un objeto asignado en la pila se destruirá automáticamente cuando salga del alcance.

En realidad, habría sido más fácil y más obvia para escribir:

CPlayer newPlayer(position, attacker); 

Una gran cantidad de compiladores optimizarán la versión informados de lo anterior es de todos modos y más fáciles de interpretar.

+0

No creo que esto sea correcto: "Un objeto asignado en el montón se destruirá automáticamente cuando se salga del alcance". – Valentin

+0

Estás en lo correcto, quise escribir "pila", no "montón". Gracias por señalar esto. –

+0

De acuerdo en esto. Deberíamos mantener el código C++ con el mismo estilo que el código C. Por lo tanto, 'CPlayer newPlayer (position, attacker);' es mejor que 'CPlayer newPlayer = CPlayer (position, attacker);' si desea crear una variable de pila. – tonga

4

newPlayer no se asigna dinámicamente variable, pero un auto, variable de Stack-asignados:

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

es diferente de

CPlayer newPlayer = CPlayer(pos, attacker); 

newPlayer se asigna en la pila a través de la CPlayer normal (posición, atacante) invocación del constructor, aunque es un tanto detallado que el habitual

CPlayer newPlayer(pos, attacker); 

Es básicamente lo mismo que decir:

int i = int(3); 
+2

Cuidado aquí. Es una "inicialización de copia". No es * una tarea. – sellibitze

+0

Me corrigen, no es una tarea; incluso el constructor de copia no está involucrado. Edite la respuesta en consecuencia. – digitalarbeiter

+2

Claro, el copiador está (al menos lógicamente) involucrado. Notarás que si haces que tu copia sea privada. Entonces, esta inicialización de copia ya no funcionará. El estándar C++ requiere un copiador accesible incluso cuando el compilador puede optimizar la copia. – sellibitze

8
CPlayer newPlayer = CPlayer(position, attacker); 

Esta línea crea un nuevo objeto local de tipo CPlayer. A pesar de su apariencia funcional, esto simplemente llama al constructor de CPlayer. No hay temporales ni copias involucradas. El objeto llamado newPlayer vive tanto como el alcance en el que está incluido. Aquí no usa la palabra clave new porque C++ no es Java.

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

Esta línea construye un objeto CPlayer en el montón y define un puntero llamado newPlayer para señalar en él. El objeto vive hasta que alguien delete s.

+2

"No hay temporales ni copias involucradas" - Esto no es exactamente cierto. No hay tal garantía. Pero cada compilador decente debe elide la copia. – sellibitze