2010-09-17 14 views
8

Cuando se crea un nuevo objeto en C++ que vive en la pila, (la forma en que he visto sobre todo es) hacer esto:C++ apilar las variables y variables montón

CDPlayer player; 

Cuando se crea un objeto en el montón de llamar new:

CDPlayer* player = new CDPlayer(); 

Pero al hacer esto:

CDPlayer player=CDPlayer(); 

crea una pila de objetos en base, b ¿Cuál es la diferencia entre eso y el mejor ejemplo?

+1

posible duplicado de [¿Hace el paréntesis después de que el nombre del tipo marque la diferencia con el nuevo?] (Http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make- a-difference-with-new) – fredoverflow

Respuesta

20

La diferencia es importante con los POD (básicamente, todos los tipos incorporados como int, bool, etc. double más c-como estructuras y uniones construidas sólo de otros POD), para los cuales existe una diferencia entre inicialización por defecto y inicialización del valor. Para los POD, un simple

T obj; 

dejará obj no inicializado, mientras T() default-inicializa el objeto. Por lo tanto,

T obj = T(); 

es una buena manera de asegurarse de que un objeto se inicialice correctamente.

Esto es especialmente útil en el código de plantilla, donde T podría ser POD o no POD. Cuando sabe que T no es un tipo de POD, es suficiente T obj;.

Adición: También puede escribir

T* ptr = new T; // note the missing() 

(y evitar la inicialización del objeto asignado si T es un POD).

+2

Los tipos definidos por el usuario también pueden ser POD, en cuyo caso se comportarán como integradas cuando no se realice una inicialización explícita. –

+0

@Konrad: ¡Tiene razón, la distinción es entre POD y no POD! Gracias por señalar esto, cambié mi respuesta en consecuencia. – sbi

+0

En C++ 0x, puede garantizar una inicialización adecuada con 'T obj {};'. – fredoverflow

8

Cuando se crea un nuevo objeto en C++ que vive en la pila, (...) que hacer esto:

CDPlayer player; 

No necesariamente en la pila: variables declaradas de esta manera tienen automática almacenamiento. A dónde van realmente depende. Puede estar en la pila (en particular cuando la declaración está dentro de un método) pero también puede estar en otro lugar.

Considérese el caso en que la declaración es dentro de una clase:

class foo { 
    int x; 
}; 

Ahora el almacenamiento de x es que cada vez la instancia de clase se almacena. Si se almacena en el montón, entonces también lo es x:

foo* pf = new foo(); // pf.x lives on the heap. 
foo f; // f.x lives where f lives, which has (once again) automatic storage. 
+4

@Tony: ¿Esto realmente responde la pregunta? Fue más bien un comentario complementario ... No toca la diferencia entre su primer y tercer código en absoluto, ya que otras respuestas ya lo han hecho. –

0
CDPlayer* player = new CDPlayer(); 

Lo que esto hace en realidad es crear un puntero en la pila y hace que apunte a un objeto CDPlayer asignada en el montón.