Si la 'Prueba' es una clase ordinaria, ¿hay alguna diferencia entre:
Test* test = new Test;
//and
Test* test = new Test();
Si la 'Prueba' es una clase ordinaria, ¿hay alguna diferencia entre:
Test* test = new Test;
//and
Test* test = new Test();
Vamos a llegar pedante, porque hay diferencias que realmente puede afectar a su código de conducta. Mucho de lo siguiente es tomado de los comentarios realizados a un "Old New Thing" artículo.
A veces la memoria devuelta por el nuevo operador será inicializado, y a veces no, dependiendo de si el tipo que te newing es un POD (plain old datos), o si es una clase que contiene POD miembros y es el uso de un compilador-generated constructor por defecto.
Asumir:
struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m
En un compilador de C++98, el siguiente debe ocurrir:
new a() - cero-inicializar
nuevo B - defecto de construcción (B:a:m no está inicializada)
new B() - defecto de construcción (B:a:m no está inicializada)
nuevo C - defecto de construcción (C::m es inicializada en cero)
En C++03 adecúa compilador, las cosas deberían funcionar así:
new a() - valor-inicializar Una, que es la inicialización de cero, ya que es un POD.
nuevo B - default-inicializa (hojas B:a:m no inicializado)
new B() - valor-inicializa B que cero inicializa todos los campos desde su defecto cto r es el compilador genera frente a definida por el usuario.
nuevo C - default-inicializa C, que llama a la predeterminada cto r.
Así, en todas las versiones de C++ hay una diferencia entre "new A
" y "new A()
" porque es una VAINA.
Y hay una diferencia en el comportamiento entre C++98 y C++03 para el caso "new B()
".
Este es uno de los polvorientos rincones de C++ que puede volverte loco. Cuando la construcción de un objeto, a veces quiere/necesita el paréntesis, a veces usted no puede tener, y a veces no importa.
new Thing();
es explícita que desea un constructor llamado considerando new Thing;
se toma para dar a entender que no le importa si el constructor no es llamado.
Si se utiliza en una struct/clase con un usuario definido por el constructor, no hay ninguna diferencia. Si se llama a un trivial struct/clase (p. ej. struct Thing { int i; };
), a continuación, new Thing;
es como malloc(sizeof(Thing));
mientras que new Thing();
es como calloc(sizeof(Thing));
- se pone a cero inicializa.
El problema yace en el medio:
struct Thingy {
~Thingy(); // No-longer a trivial class
virtual WaxOn();
int i;
};
El comportamiento de new Thingy;
vs new Thingy();
en este caso cambiado entre C++98 y C++2003. Ver a Michael Burr explicación de cómo y por qué.
En general, hemos defecto de inicialización en el primer caso y el valor de inicialización en el segundo caso.
Por ejemplo:
en el caso de los de tipo int (POD):
int* test = new int
- hemos cualquier inicialización y el valor de *la prueba puede ser cualquiera.
int* test = new int()
- *prueba tendrá valor 0.
siguiente comportamiento dependiendo de su tipo de Prueba. Hemos deferente casos: Prueba de defult constructor de la Prueba, han generado un constructor por defecto, la Prueba de contener POD miembro, no POD miembro...
© 2017 Zigzag Horizontal SL
Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.