内置类型的构造函数初始化 我现在正在阅读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