2010-06-01 32 views
7

Digamos que tiene una estructura que se parece a esto (POD):defecto Struct inicialización en C++

struct Foo 
{ 
    int i; 
    double d; 
}; 

¿Cuáles son las diferencias entre las dos líneas siguientes:

Foo* f1 = new Foo; 
Foo* f2 = new Foo(); 
+0

Tenga en cuenta la pregunta relacionada [¿Por qué es un error utilizar un conjunto vacío de corchetes para llamar a un constructor sin argumentos?] (Http://stackoverflow.com/questions/180172/why-is-it-an- error-to-use-an-empty-set-of-brackets-to-call-a-constructor-with-no). – Troubadour

Respuesta

12

El primero deja los valores sin inicializar; el segundo los inicializa a cero. Este es solo el caso para los tipos de POD, que no tienen constructores.

+0

¡Gracias! ¿Es esa la única diferencia? – criddell

+5

Sí, esa es la única diferencia. –

+0

Y si no me equivoco, esto solo se agregó en algunas revisiones más recientes del estándar (¿2003?) – Suma

-2

Por el enlace que he al corriente.

En C++, la única diferencia entre una clase y una estructura es que los miembros de la clase son privados por defecto, mientras que los miembros de la estructura son públicos por defecto. Entonces las estructuras pueden tener constructores, y la sintaxis es la misma que para las clases.

Struct Constructor Info

+1

El punto es el uso u omisión de los corchetes curvos cuando se construyen objetos nuevos. La pregunta se aplica tanto a las clases como a las estructuras. – Troubadour

1

supongo nada en absoluto. Foo() está permitido, incluso si no tiene sentido ... He intentado cambiar struct en class y probé una diferencia en el exe generado, y resultaron ser los mismos, lo que significa que una clase sin método es como una estructura de un punto de vista práctico y "efectivo".

Pero: si sólo utiliza uno de la alternativa, manteniendo struct o class no importa, sucede que new Foonew Foo() y da ejecutables que se diferencian! (Al menos usando g ++) es decir

 
struct Foo { int i; double d; } 
int main() { Foo *f1 = new Foo; delete f1; } 

se compila en somehing diferente de

 
struct Foo { int i; double d; } 
int main() { Foo *f1 = new Foo(); delete f1; } 

y lo mismo sucede con class en lugar de struct. Para saber dónde está la diferencia deberíamos mirar el código generado ... y para saber si es una idiosincrasia de g ++ o no, debería probar con otro compilador pero ahora solo tengo gcc y no hay tiempo para analizar la salida de asm de g ++. ..

De todos modos desde un punto de vista "funcional" (práctico), es lo mismo.

Añadir

Al final siempre es mejor saber o hacer una investigación más profunda para algunos problemas humanos comunes en los sitios Q/A ... la única diferencia en el código generado por g ++ en() y no() en los casos,

 
    movl $0, (%eax) 
    fldz 
    fstpl 4(%eax) 

que es un fragmento que inicializa a 0/0,0 int y el doble de la estructura ... así Seymour sabe mejor (pero podría haber descubierto que sin saber si tenía echó un vistazo a la ASM primero!)

+0

¿Por qué el uso de corchetes no tiene sentido, está invocando el constructor predeterminado. En todo caso, la falta de parens no tiene sentido. – Salgar

+0

¿qué estás diciendo? es una prueba, plausible para la pregunta y el hecho de que foo() normalmente significa una llamada a una función/método; una prueba no tan útil, en lugar de una lectura de especificaciones, esto hubiera sido un posible crítico. Tu comentario no significa nada para mí. – ShinTakezou