共用方式為


POD 和純量型別的零初始化

更新:2007 年 11 月

如果是以預設建構函式語法具現化 (Instantiated),則一定會將 POD 和純量型別 (Scalar Type) 零初始化。

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;

初始化之後,Visual Studio .NET 的行為會忽略 () 括弧,並且一定不會將成員初始化。針對函式的初始化清單以外之初始化型別,若要回復至 Visual Studio .NET 行為,請如下所示移除 () 括弧:

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.

針對函式的初始化清單內之初始化型別,若要回復至 Visual Studio .NET 行為,請如下所示從清單中移除初始化:

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

請參閱

參考

Visual C++ 編譯器的重大變更