关于对象初始化语义的问题

时间:2011-08-11 21:33:19

标签: c++ standards

我一直想知道围绕对象初始化的C ++ 03规范中的语言,特别是第8.5节第9段,

“如果没有为对象指定初始化程序,并且该对象属于(可能是cv限定的)非POD类类型(或 其数组),对象应默认初始化;如果对象是const限定类型,则为底层 类类型应具有用户声明的默认构造函数。否则,如果没有为非静态指定初始化程序 对象,对象及其子对象(如果有)具有不确定的初始值;如果对象或任何 其子对象属于const限定类型,程序格式不正确。“

我想特别注意子句“否则,如果没有为非静态指定初始值设定项 对象,对象及其子对象(如果有)具有不确定的初始值“。根据第8.5节第5段,默认初始化的定义分为三种情况:

  1. 如果T是非POD类类型(第9节),则调用T的默认构造函数(并且初始化为 如果T没有可访问的默认构造函数,则格式不正确)
  2. 如果T是数组类型,则每个元素都是默认初始化的
  3. 否则,该对象为零初始化。
  4. 据我理解,第9段说明如果我们有一个没有初始化器的非POD类类型,那么它将被调用默认构造函数。令我困惑的是在POD类类型的情况下会发生什么......从我强调的条款看来,没有提到POD类类型需要默认的构造函数调用。然而,如果我创建了像

    这样的POD类
    struct POD_class
    {
        int a;
        int b;
        POD_class() { cout << "Default constructor called" << endl; }
    };
    
    int main()
    {
        POD_class test;
        return 0;
    }
    

    在编译此代码并使用POD_class运行时,似乎会调用g++的默认构造函数。因此,即使POD_class没有特定的初始化程序,它似乎仍然是默认初始化的,默认初始化定义中的情况#1,因为调用了该类型的默认构造函数。

    基于上面的场景,这是我的问题:对于POD类,默认初始化对象,因为第9段提到的非静态POD类意味着它的默认构造函数是没有被叫,或者它根本没有被零初始化?

1 个答案:

答案 0 :(得分:5)

您的POD_class实际上不是POD课程。 POD类不能有用户声明的构造函数。