构造函数初始化内置类型

时间:2018-06-11 21:59:26

标签: c++ gcc

所以我现在正在阅读" C ++编程语言"作者:Bjarne Stroustrup(伟大的书),并在第17.3.1节中提到,没有定义构造函数且没有初始化器初始化的对象将(在非静态情况下)保留内置类型undefined。

我有这段代码

#include <iostream>

class A {
public:
    int id;
    // No constructor defined,
    // so default constructor generated
};

void f() {
    A a; // No initializer
    std::cout << a.id << std::endl;
}

int main(int argc, char *argv[]) {
    f();
    return 0;
}

我希望在运行此代码时打印垃圾,但我得到0的初始化(a.id)值。另外,如果我们将A重新定义为:

class A {
public:
    int id;
    A()=default;
};

现在,当我运行此代码时,a.id将是垃圾值,正如我之前所预期的那样。

对于第一种情况,为什么A的id成员被初始化?为什么这两种情况导致不同的结果?

我正在使用g ++ / gcc版本8.1.0

2 个答案:

答案 0 :(得分:2)

  

但我获得了a.id

的初始化(0)值

仅仅因为该值恰好为0并不意味着它已初始化。读取未初始化的值为undefined behavior,因此输出可以是任何值,包括0。

如果我在我的系统上运行相同的代码,我会得到以下输出:

791621423

答案 1 :(得分:0)

  

对于第一种情况,为什么A的id成员被初始化?为什么   这两种情况会导致不同的结果吗?

a

std::cout << a.id << std::endl; // undefined behavior for a.id 未初始化,其不确定值

根据dcl.init/12

  

如果没有为对象指定初始化程序,则该对象为   缺省初始化。使用自动或存储对象时   获得动态存储持续时间,该对象具有不确定性   值,如果没有对该对象执行初始化,那么   对象保留不确定的值,直到替换该值。

使用具有不确定值的变量是未定义的行为

{{1}}

因此,在不同情况下导致不同的值。