Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Aggiornamento: novembre 2007
I tipi POD e scalari saranno sempre inizializzati a zero se è stata creata un'istanza con la sintassi del costruttore predefinito.
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;
Il comportamento di Visual Studio .NET ignora le () parentesi dopo l'inizializzazione e lascerà sempre i membri non inizializzati. Per ripristinare il comportamento di Visual Studio .NET per i tipi inizializzati fuori dall'elenco di inizializzazione di un costruttore, rimuovere le () parentesi come segue:
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.
Per ripristinare il comportamento di Visual Studio .NET per i tipi inizializzati all'interno di un elenco di inizializzazione di un costruttore, rimuovere le () parentesi come segue:
class C
{
T t;
int i;
public:
C() {} // Members of class are not initialized.
};