Compartir a través de


Inicialización en cero de tipos escalares y POD

Actualización: noviembre 2007

Los tipos escalares y POD siempre se inicializarán a cero si se crean instancias de ellos con la sintaxis de constructor predeterminada.

struct S {
   void *operator new (unsigned int size, void*p, int i)
   {
      ((S*)p)->i = i; return p;
   }
     
   int i;
};

struct T
{
   int i;
   char c;
};

class C
{
   T t;
   int i;
public:
   C(): t(), i() {}   // Zero initializes members of class.
};

// Zero initialize members of t.
// t->i == 0 & t->c == 0
T* t = new T();

// Call placement new operator for S, then
// zero initialize members of pS.
// pS->i == 0 & pS->i != 10
S s;
S* pS = new( &s, 10 ) S();

// Zero initialize *pI
// *pI == 0
int* pI = new int();

// Zero initialize members of c
// c.t.i == 0 & c.t.c == 0 & c.i == 0
C c;

El comportamiento de Visual Studio .NET omite los paréntesis () después de la inicialización y deja siempre los miembros sin inicializar. Para revertir al comportamiento de Visual Studio .NET para tipos inicializados fuera de la lista de inicialización de un constructor, quite los paréntesis () del siguiente modo:

T* t = new T;   // Members contain uninitialized data.
S s;
S* pS = new( &s, 10 );   // pS->i == 10
int* pI = new int;   // *pI is uninitialized.

Para revertir al comportamiento de Visual Studio .NET para tipos inicializados dentro de la lista de inicialización de un constructor, quite la inicialización de la lista del siguiente modo:

class C
{
   T t;
   int i;
public:
   C() {}   // Members of class are not initialized.
};

Vea también

Referencia

Cambios importantes en el compilador de Visual C++