665 votos

¿El paréntesis después del nombre del tipo de hacer una diferencia con la nueva?

Si la 'Prueba' es una clase ordinaria, ¿hay alguna diferencia entre:

Test* test = new Test;
//and
Test* test = new Test();

672voto

Michael Burr Puntos 181287

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.

  • En C++1998 hay 2 tipos de inicialización: el cero y el defecto
  • En C++2003 un 3er tipo de inicialización, el valor de inicialización, se añadió.

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:

  • nuevo valor indeterminado
  • 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)

  • new C() - defecto de construcción (C::m es inicializada en cero)

En C++03 adecúa compilador, las cosas deberían funcionar así:

  • nuevo valor indeterminado
  • 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.

  • new C() - valor-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.

13voto

kfsone Puntos 61

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é.

12voto

bayda Puntos 7454

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...

9voto

Evan Shaw Puntos 7957

Suponiendo que la Prueba es una clase con un constructor, no hay ninguna diferencia. La última forma hace que sea un poco más clara que la Prueba del constructor se está ejecutando, pero de eso se trata.

Iteramos.com

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.

Powered by:

X