Partager via


Initialisation à zéro de types POD et scalaires

Mise à jour : novembre 2007

Les types POD et scalaires seront toujours initialisés à zéro s'ils sont instanciés avec la syntaxe du constructeur par défaut.

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;

Le comportement de Visual Studio .NET ignore les parenthèses () après l'initialisation et n'initialisera pas les membres. Pour rétablir le comportement Visual Studio .NET pour les types initialisés en dehors de la liste d'initialisation d'un constructeur, supprimez les parenthèses () comme suit :

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.

Pour rétablir le comportement Visual Studio .NET pour les types initialisés dans la liste d'initialisation d'un constructeur, supprimez l'initialisation de la liste comme suit :

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

Voir aussi

Référence

Modifications avec rupture dans le compilateur Visual C++