内置类型的构造函数初始化

Constructor initialization of built-in types

本文关键字:初始化 构造函数 置类型 内置      更新时间:2023-10-16

所以我目前正在阅读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

因此,在不同情况下产生不同的值。