内置类型的构造函数初始化
Constructor initialization of built-in types
所以我目前正在阅读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
因此,在不同情况下产生不同的值。
相关文章:
- 为什么std::vector和std::valarray初始化构造函数不同
- 初始化构造函数C++中结构的向量
- C++ 中常量属性的初始化构造函数错误
- 不正确的输出和变量未用Eclipse CDT初始化构造函数
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- 如何通过参数初始化构造函数中的数组?
- 是否有理由使用 malloc 初始化构造函数中的指针
- 如何在 c++ 中初始化构造函数中的二维数组
- 为什么初始化构造函数列表参数时会发生异常?
- 无法初始化构造函数
- 初始化构造函数的默认参数的优选方法是什么?
- 在C++17中使用空列表初始化构造函数时发生编译错误
- C++ 初始化构造函数初始化列表中的嵌套结构?
- 初始化构造函数c++中的向量
- g++ (GCC) 4.6.0 我有以下类,我正在尝试初始化构造函数的结构成员初始化列表
- 使用字符串文本初始化构造函数中的 std::array<char,x> 成员。海湾合作委员会错误?
- 初始化构造函数C++中函数的成员指针
- 在c++中初始化构造函数中的静态成员变量时出错
- memset()初始化构造函数中的对象
- 初始化构造函数C++中的成员向量