在C ++中,下面的语句意味着什么:零,初始值和初始值?

在C ++中下面的短语是什么意思:

  • 零初始化,

  • 默认初始化和

  • 值初始化

C ++开发人员应该知道些什么?

有一件事要认识到,“价值初始化”是C ++ 2003标准中的新概念,它并不存在于1998年的原始标准中(我认为这可能是唯一的区别,而不仅仅是澄清)。 请参阅Kirill V. Lyadvinsky对于标准定义的回答 。

有关这些初始化types的不同行为以及何时启动(以及它们与C ++ 98到C ++ 03不同)的详细信息,请参阅以前有关operator new的行为的回答:

  • types名称后的圆括号与新的有什么不同?

答案的要点是:

有时,新运算符返回的内存将被初始化,有时不会取决于新build的types是POD,还是包含POD成员的类,并使用编译器生成的默认构造函数。

  • 在C ++ 1998中有两种types的初始化:零和默认
  • 在C ++ 2003中第三种types的初始化,增加了值初始化。

至less可以说,这是相当复杂的,当不同的方法踢的是微妙的。

有一件事一定要注意的是,即使在VS 2008(VC 9或cl.exe版本15.x)中,MSVC也遵循C ++ 98规则。

以下片段显示MSVC和Digital Mars遵循C ++ 98规则,而GCC 3.4.5和Comeau遵循C ++ 03规则:

 #include <stdio.h> #include <string.h> #include <new> 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 int main() { char buf[sizeof(B)]; memset( buf, 0x5a, sizeof( buf)); // use placement new on the memset'ed buffer to make sure // if we see a zero result it's due to an explicit // value initialization B* pB = new(buf) B(); //C++98 rules - pB->m is uninitialized //C++03 rules - pB->m is set to 0 printf( "m is %d\n", pB->m); return 0; } 

C ++ 03标准8.5 / 5:

初始化 Ttypes的对象意味着:
– 如果T是标量types(3.9),则将该对象设置为转换为T的0(零)值;
– 如果T是一个非联合类types,则每个非静态数据成员和每个基类子对象都被初始化;
– 如果T是联合types,那么该对象的第一个命名数据成员是零初始化的;
– 如果T是一个数组types,每个元素都是零初始化的;
– 如果T是引用types,则不执行初始化。

默认初始化 Ttypes的对象意味着:
– 如果T是非POD类types(第9章),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化不合格)。
– 如果T是数组types,则每个元素都默认初始化;
否则,该对象是零初始化的。

为了初始化 Ttypes的对象,意味着:
– 如果T是一个具有用户声明的构造函数(12.1)的类types(第9章),那么将调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化为格式错误)。
– 如果T是没有用户声明的构造函数的非联合类types,则T的每个非静态数据成员和基类组件都被初始化;
– 如果T是一个数组types,则每个元素都进行了值初始化;
否则,该对象是零初始化的

调用引用types的实体的默认初始化或值初始化的程序是不合格的。 如果T是一个cv限定types,则c的非限定版本T用于零初始化,缺省初始化和值初始化的这些定义。