【发布时间】:2021-07-05 23:10:24
【问题描述】:
如果我将向量成员替换为另一个基本类型变量(例如 int y),x 不会像预期的那样被初始化。 vector 成员对成员 x 做了什么,这使得 x 被初始化,即使它在声明时没有初始化并且基本类型不应该在创建时初始化?
#include <vector>
#include <iostream>
class Buffer
{
private:
std::vector<char> buffer;
int x;
public:
Buffer(int width, int height) // buffer gets initialized to size 0, and x gets initialized to 0
{
buffer.resize(width * height); // buffer gets resized to argument values
}
};
int main()
{
Buffer screen_2(10,10); // member x get initialized to 0
return 0;
}
【问题讨论】:
-
x恰好为 0 并不意味着它已被初始化 -
由于
Buffer的构造函数没有初始化x,所以screen_2的成员x未初始化。访问它的值会给出未定义的行为。在未定义的行为范围内,一种可能性是x被初始化为零值。然而,这并不能保证会发生。这也意味着测试(在您的情况下,大概是使用调试器检查screen_2.x的值,或者使用您未显示的代码访问它)不是确定的。您观察到零值并不意味着该成员被初始化为零。 -
@Peter,谢谢。问题是在进入构造函数之前 x 有一个随机值(我使用的是调试器 VS2019,Win 10)并且在进入之后它立即变为 0。另一件事是当我将向量替换为另一个 int 之前,在输入缓冲区构造函数 x 有一个随机值,进入后它仍然是随机值。这种行为上的差异让我说 x 被初始化了。现在,在告诉你这个之后,你仍然说即使 x 的值从随机值变为零,这也被认为是未定义的行为? (再次感谢)
-
这很奇怪。调试模式下的 VS 应使用 0xCC 等预定义值填充未初始化的字节。确保将配置设置为调试。
-
@WalterS.Escobedo - 根据标准,该成员未初始化。没有什么可以阻止实现(例如编译器)实际初始化成员。但是一个编译器可以将它初始化为零。另一个编译器可以将其初始化为
42。另一个不能做任何事情,并且该值对应于当时内存中的物理字节。从标准的角度来看,所有这些编译器都是正确的。 (请记住 - 标准是评估实现正确性的标准,而不是相反)。
标签: c++ class vector integer c++17