以下短语在C++中的含义是什么:
零初始化(zero-initialization)
默认初始化(default-initialization)
值初始化(value-initialization)
C++开发人员需要了解它们的哪些方面?
零初始化(zero-initialization)
默认初始化(default-initialization)
值初始化(value-initialization)
C++开发人员需要了解它们的哪些方面?
需要注意的一点是,“value-initialization”是C++ 2003标准中新增的——在原始的1998标准中不存在(我认为这可能是唯一一个不仅仅是澄清的差异)。请参见Kirill V. Lyadvinsky的答案,其中包含了标准定义。
关于这些初始化类型的不同行为以及它们何时启用(以及它们从C++98到C++03的不同之处),请参见此前的回答:operator new
的行为细节:
该回答的主要观点是:
有时,由new运算符返回的内存将被初始化,有时则不会,这取决于您正在创建的类型是否为POD,或者它是一个包含POD成员并正在使用编译器生成的默认构造函数的类。
- C++1998有两种初始化类型:零初始化和默认初始化
- C++2003新增了第三种初始化类型:值初始化。
不言而喻,这相当复杂,不同方法启动的时间也很微妙。
需要特别注意的一点是,MSVC即使在VS 2008(VC 9或cl.exe版本15.x)中仍遵循C++98规则。
以下代码段显示了MSVC和Digital Mars遵循C++98规则,而GCC 3.4.5和Comeau遵循C++03规则:
#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;
}
int
来说并不重要,但是在第三行中 m()
的值初始化了 m。如果你将 int m;
改为 B m;
,这一点就很重要了。 :) - Johannes Schaub - litbstruct C { C() : m() {}; ~C(); B m; };
,那么你将会得到m.m
为0。但是,如果它像你所说的C++03一样默认初始化m
,那么m.m
将不会像在C++98中一样被初始化。 - Johannes Schaub - litb