首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以下短语在C++中意味着什么:零、默认和值初始化?

以下短语在C++中意味着什么:零、默认和值初始化?
EN

Stack Overflow用户
提问于 2009-10-23 13:14:45
回答 2查看 35.6K关注 0票数 208

在C++中,以下短语意味着什么:

  • zero-initialization,
  • default-initialization,and
  • value-initialization

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-23 13:48:46

需要认识到的一件事是,“值-初始化”是C++ 2003标准中的新内容--它在1998年的标准中并不存在(我认为这可能是唯一的区别,而不仅仅是澄清)。直接从标准中获得定义,请参见Kirill V. Lyadvinsky's answer

请参阅关于operator new行为的前面这个答案,了解这些类型初始化的不同行为以及它们何时启动(以及它们与c++98和C++03的不同之处):

答案的要点是:

有时新操作符返回的内存将被初始化,有时它将不取决于您要更新的类型是POD,或者它是否是包含POD成员的类,并且使用编译器生成的默认构造函数。

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

至少他们说,这是相当复杂的,当不同的方法开始的时候是微妙的。

当然要注意的是,MSVC遵循C++98规则,甚至在VS 2008 (VC 9或cl.exe版本15.x)中也是如此。

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

代码语言:javascript
复制
#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;
}
票数 67
EN

Stack Overflow用户

发布于 2009-10-23 13:20:55

C++03标准8.5/5:

zero-initialize类型为T的对象的

表示:

-如果T是标量类型(3.9),则将对象设置为转换为T的0(0)值;

-如果T是非并类类型,则每个非静态数据成员和每个基类子对象都为零初始化;

-如果T是一个联合类型,则对象的第一个命名数据成员为零初始化;

-如果T是数组类型,则每个元素都为零初始化;

-如果T是引用类型,则不执行初始化。要default-initialize,T类型的对象意味着:

-如果T是非POD类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化不正确);

-如果T是数组类型,则每个元素都是默认初始化的;

-否则,对象将为零初始化。

value-initialize,T类型的对象意味着:

-如果T是具有用户声明的构造函数(12.1)的类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

-如果T是一个没有用户声明的构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都是值初始化的;

-如果T是数组类型,则每个元素都是值初始化的;

-否则,对象将为零初始化。

调用引用类型实体的默认初始化或值初始化的程序格式不正确.如果T是cv限定类型,则使用cv不限定的T版本来定义零初始化、默认初始化和值初始化.

票数 91
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1613341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档