首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于对象初始化语义的问题

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

Stack Overflow用户
提问于 2011-08-11 21:33:19
回答 1查看 147关注 0票数 1

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

“如果没有为一个对象指定初始化程序,并且该对象是(可能是cv-限定的)非POD类类型(或数组),则该对象将默认初始化;如果该对象为const限定类型,则底层类类型将具有一个用户声明的默认构造函数。否则,如果未为一个非静态对象指定初始化器,则该对象及其子对象(如果有的话)具有一个不确定的初始值;如果该对象或其任何子对象为const限定类型,则程序是错误的。”

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

如果T是非constructor)

  • if类类型(第9条),则调用T的默认构造函数(如果T没有可访问的缺省值,则初始化格式不正确,则为数组类型,每个元素为default-initialized

  • otherwise,,对象为zero-initialized.

)。

因此,据我了解,第9段指出,如果我们有一个没有初始化器的非POD类类型,那么它的默认构造函数就会被调用。我困惑的是在POD类的情况下会发生什么.从我强调的子句中,似乎没有提到POD类类型需要默认的构造函数调用。但是,如果我创建了一个POD类类型,如

代码语言:javascript
复制
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类那样默认初始化对象是否意味着它的默认构造函数没有被调用,或者它根本不是零初始化的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-11 21:35:40

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

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

https://stackoverflow.com/questions/7033148

复制
相关文章

相似问题

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