所以我目前正在阅读Bjarne Stroustrup(好书(的"C++编程语言",它在17.3.1节中提到,没有定义的构造函数并且没有初始化器初始化的对象将(在非静态情况下(保持内置类型未定义。
我有这个代码
#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;
}
我希望在运行此代码时打印垃圾,但相反,我得到了a.id
的初始化(0
(值。此外,如果我们将A
重新定义为:
class A {
public:
int id;
A()=default;
};
现在,当我运行此代码时,a.id
将是垃圾值,正如我之前所期望的那样。
对于第一种情况,为什么要初始化 A 的id
成员?为什么这两种情况的结果不同?
我正在使用 g++/gcc 版本 8.1.0
但我得到了一个初始化的 (0( 值
a.id
仅仅因为值恰好为 0 并不意味着它已初始化。 读取未初始化的值是未定义的行为,因此输出可以是任何内容,包括 0。
如果我在我的系统上运行相同的代码,我会得到以下输出:
791621423
对于第一种情况,为什么要初始化 A 的 id 成员?为什么 这两种情况是否导致不同的结果?
A a; // No initializer
a
未初始化,将具有不确定的值。
根据 dcl.init/12
如果未为对象指定初始值设定项,则该对象为默认初始化。当存储对象时具有自动或 得到动态存储持续时间,对象具有不确定 值,如果未对对象执行初始化,则 对象保留一个不确定的值,直到该值被替换。
使用具有不确定值的变量是未定义的行为。
std::cout << a.id << std::endl; // undefined behavior for a.id
因此,在不同情况下产生不同的值。