所以我现在正在阅读" 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
答案 0 :(得分:2)
但我获得了
的初始化(0)值a.id
仅仅因为该值恰好为0并不意味着它已初始化。读取未初始化的值为undefined behavior,因此输出可以是任何值,包括0。
如果我在我的系统上运行相同的代码,我会得到以下输出:
791621423
答案 1 :(得分:0)
对于第一种情况,为什么A的id成员被初始化?为什么 这两种情况会导致不同的结果吗?
a
std::cout << a.id << std::endl; // undefined behavior for a.id
未初始化,其不确定值。
如果没有为对象指定初始化程序,则该对象为 缺省初始化。使用自动或存储对象时 获得动态存储持续时间,该对象具有不确定性 值,如果没有对该对象执行初始化,那么 对象保留不确定的值,直到替换该值。
使用具有不确定值的变量是未定义的行为。
{{1}}
因此,在不同情况下导致不同的值。