了解隐式声明的默认构造函数

2024-03-24

我试图了解编译器的默认构造函数是如何工作的。我做了这个例子:

#include <iostream>

class Base {
    public:
    int number;
};

class Test1 : public Base {  
};

class Test2 {
    public:
    Base base;
};

int main() {
    Test1 test1;
    Test2 test2;
    std::cout<<test1.number<<std::endl;
    std::cout<<test2.base.number<<std::endl;
}

该测试程序的输出为test1 0,并且对于test2是一个未初始化的(随机)数。现在我的问题是:为什么在第一种情况下(test1) 编译器的默认构造函数初始化number to 0但对于test2不是吗?

Edit:根据答案,两者都会产生未定义的行为。那么,在这个程序中,编译器的默认构造函数做了什么?


未初始化对象的值是不定根据 8.5/12:

如果没有为对象指定初始化程序,则该对象将被默认初始化。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有不确定值,并且如果没有对该对象执行初始化,则该对象将保留不确定值,直到该值被替换(5.17)。

对你来说不幸的是,int根据 §8.5/7 属于“非默认初始化类型”类别:

默认初始化 T 类型的对象意味着:

  • 如果 T 是一个(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(12.1)(如果 T 没有默认构造函数或重载解析(13.3),则初始化格式错误,导致歧义或在从初始化上下文中删除或无法访问的函数中);
  • 如果 T 是数组类型,则每个元素都默认初始化;
  • 否则,不执行初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解隐式声明的默认构造函数 的相关文章

随机推荐