我一直想知道C++03规范中围绕对象初始化的语言,特别是8.5段第9段,其中指出,
“如果没有为一个对象指定初始化程序,并且该对象是(可能是cv-限定的)非POD类类型(或数组),则该对象将默认初始化;如果该对象为const限定类型,则底层类类型将具有一个用户声明的默认构造函数。否则,如果未为一个非静态对象指定初始化器,则该对象及其子对象(如果有的话)具有一个不确定的初始值;如果该对象或其任何子对象为const限定类型,则程序是错误的。”
我要特别注意子句,“否则,如果没有为非静态对象指定初始化器,则对象及其子对象(如果有的话)具有一个不确定的初始值”。根据第8.5节第5款,默认初始化的定义可分为三种情况:
如果T是非constructor)
)。
因此,据我了解,第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类那样默认初始化对象是否意味着它的默认构造函数没有被调用,或者它根本不是零初始化的?
发布于 2011-08-11 21:35:40
实际上,您的POD_class不是POD类。POD类不能有用户声明的构造函数.
https://stackoverflow.com/questions/7033148
复制相似问题