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

以下短语在C ++中的含义如下:

  • 零初始化,

  • 默认初始化和

  • 值初始化

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


    有一点需要认识的是,'值初始化'是C ++ 2003标准中的新增功能 - 它并不存在于1998年的原始标准中(我认为这可能是唯一不同之处,不仅仅是澄清)。 有关直接来自标准的定义,请参阅Kirill V. Lyadvinsky的答案。

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

  • 类型名称后面的括号与新的有什么不同?
  • 答案的要点是:

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

  • 在C ++ 1998中,有两种类型的初始化:零和默认
  • 在C ++ 2003中第三种类型的初始化,增加了值初始化。
  • 至少可以这么说,这是相当复杂的,当不同的方法开始的时候是微妙的。

    肯定要注意的一件事是,即使在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 %dn", pB->m);
        return 0;
    }
    

    C ++ 03标准8.5 / 5:

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

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

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

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

    链接地址: http://www.djcxy.com/p/40661.html

    上一篇: What do the following phrases mean in C++: zero

    下一篇: new int[size] vs std::vector