Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内置类型的构造函数初始化 我现在正在阅读Bjarne Stroustrup(GooBooad)的“C++编程语言”,它在第173.1节中提到,一个没有定义构造函数的对象,如果没有初始化器,它将(在非静态情况下)留下未定义的内置类型。_C++_Gcc - Fatal编程技术网

内置类型的构造函数初始化 我现在正在阅读Bjarne Stroustrup(GooBooad)的“C++编程语言”,它在第173.1节中提到,一个没有定义构造函数的对象,如果没有初始化器,它将(在非静态情况下)留下未定义的内置类型。

内置类型的构造函数初始化 我现在正在阅读Bjarne Stroustrup(GooBooad)的“C++编程语言”,它在第173.1节中提到,一个没有定义构造函数的对象,如果没有初始化器,它将(在非静态情况下)留下未定义的内置类型。,c++,gcc,C++,Gcc,我有这个密码 #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, cha

我有这个密码

#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
将是垃圾值,正如我之前所预期的那样

对于第一种情况,为什么要初始化的
id
成员?为什么这两个案例会产生不同的结果

我使用的是g++/gcc版本8.1.0

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

a
未初始化,其值不确定

依照

如果没有为对象指定初始值设定项,则该对象为 默认值已初始化。使用自动或 获取动态存储持续时间时,对象具有不确定 值,如果未对对象执行初始化,则 对象保留一个不确定的值,直到该值被替换为止

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

std::cout
但是我得到了
a.id

值恰好为0并不意味着它已初始化。读取未初始化的值是非常困难的,因此输出可以是任何内容,包括0

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

791621423

“未定义的行为”,如使用未定义的值,意味着任何事情都可能发生,包括获得零等无聊的事情。看到0值并不意味着
a.id
正在初始化。你看到的是剩下的东西;有时这似乎是有道理的,但这是垃圾。看到了吗
A a; // No initializer
std::cout << a.id << std::endl; // undefined behavior for a.id
791621423