以下短语在 C++ 中意味着什么:零初始化、默认初始化和值初始化?
以下短语在 C++ 中的含义是什么:
零初始化、
默认初始化和
值初始化
C++ 开发人员应该了解它们什么?
What do the following phrases mean in C++:
zero-initialization,
default-initialization, and
value-initialization
What should a C++ developer know about them?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(2)
如何视而不见2024-08-15 21:55:02
需要认识到的一件事是“值初始化”是 C++ 2003 标准中的新内容 - 它在最初的 1998 标准中不存在(我认为这可能是唯一的区别,不仅仅是澄清)。请参阅基里尔V. Lyadvinsky 对直接来自标准的定义的回答。
请参阅之前有关 operator new
行为的答案,详细了解这些类型的初始化的不同行为以及它们何时启动(以及它们何时从 c++98 到 C++03 有所不同) :
的要点答案是:
有时 new 运算符返回的内存会被初始化,有时则不会初始化,具体取决于您要新建的类型是否是 POD,或者是否是包含 POD 成员并正在使用编译器的类 -生成的默认构造函数。
- 在 C++1998 中,有两种类型的初始化:零和默认
- 在 C++2003 中添加了第三种类型的初始化,即值初始化。
至少可以说,它相当复杂,而且不同的方法何时发挥作用是微妙的。
当然需要注意的一件事是,MSVC 遵循 C++98 规则,即使在 VS 2008(VC 9 或 cl.exe 版本 15.x)中也是如此。
以下代码片段显示 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;
}
~没有更多了~
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
C++03 标准 8.5/5:
C++03 Standard 8.5/5: