什么时候基本的 C++ 类型(例如 int
或 float
)具有未知的初始值?
内存分配类型如何影响(如果有的话)?声明呢?如果它是 class
/struct
/union
的成员怎么办? C++11 与 C++03 或 C++98 有什么不同?
我有我的怀疑,但不知道我的知识是否完整(或正确,就此而言)
最佳答案
任何POD数据(包括所有基本类型)在以下情况下将具有未知值:
- 它没有static memory allocation (它是在堆栈上或使用
new
创建的) - 未初始化,包括空初始化和/或构造函数初始化列表
在调用 main
之前,作为启动过程的一部分,所有类型的全局/静态变量都设置为零。为在 main
之前具有构造函数的类型调用构造函数 1 .
任何未在构造函数中初始化的东西也是未知的。
编辑:澄清一下,std::string
是“构造函数未初始化所有内容”的一个很好的示例 - 如果您有本地 std::string str;
,则 str
将具有已定义的“空字符串”内容,但实际缓冲区的内容,或者实际上缓冲区指向的内容可能根本没有设置为任何有意义的内容- 因为一旦我们开始使用字符串来存储内容,实现可能会根据长度 [或其他方式] 确定是否有可用的缓冲区]。
Edit2: 正如评论所解释的那样,您也可以有“混合”情况,其中结构的某些部分正在被初始化,例如一个 struct
,它包含一些“纯数据”元素和一些具有构造函数的元素。那些有构造函数的将调用它们的构造函数。普通数据不会被初始化。
1运行构造函数的代码很可能是“main”函数的一部分,或者是从“main”函数内部调用的——但如果是这种情况,它将是“在 main 中的任何代码启动之前”。
关于c++ - 基本 C++ 类型何时具有未知的初始值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782176/