小编典典

以下短语在 C++ 中的含义是什么:零初始化、默认初始化和值初始化?

all

以下短语在 C++ 中的含义是什么:

  • 零初始化,

  • 默认初始化,和

  • 值初始化

C++ 开发人员应该对它们了解什么?


阅读 112

收藏
2022-06-29

共1个答案

小编典典

要意识到的一件事是,“值初始化”是 C++ 2003 标准中的新内容——它在 1998
年的原始标准中不存在(我认为这可能是唯一的区别,不仅仅是澄清)。有关直接来自标准的定义,请参见Kirill V. Lyadvinsky
的回答。

operator new有关这些类型初始化的不同行为以及它们何时启动(以及它们何时从 c98 到 C03
不同)的详细信息,请参阅有关行为的先前答案:

答案的要点是:

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

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

至少可以说,这是相当复杂的,并且当不同的方法开始时是微妙的。

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

以下片段显示 MSVC 和 Digital Mars 遵循 C98 规则,而 GCC 3.4.5 和 Comeau 遵循 C03 规则:

#include <cstdio>
#include <cstring>
#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)];
    std::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
    std::printf( "m  is %d\n", pB->m);
    return 0;
}
2022-06-29