1

更新: 我得到真实的原因是因为任何不是 0 的东西都会被认为是真实的,这显然对我在未初始化时变得虚假的可能性有多大意义。

我在 StackOverflow 上阅读了与我的问题类似的帖子,它谈到初始化所有成员变量是一种很好的做法,我同意这一点。帖子:默认情况下,布尔变量并不总是假的?

这篇文章有点旧(9 年前),所以我只是认为在新的 C++ 版本中可能已经改变了一些东西,我目前使用的是 C++17。我还有一个与帖子中讨论的问题略有不同的问题。

我知道,如果一个变量未初始化,它可能包含一些“垃圾数据”,或者正如帖子中的答案之一所说(我认为这就是他们的意思,但我不是 100% 确定),“如果没有明确已初始化——将包含一个任意值。”。

我已经尝试过测试,结果表明当我没有初始化我的变量时,它们包含随机数(对于 int,double)。我还测试了 std::string 但从我所看到的默认情况下它们被设置为“”。

无论如何,现在当我尝试使用内置类型时,bool我总是会得到真实的(在构造类之后,但布尔值再次从未初始化,我会进入调试并看到该值是真实的),我感到困惑的是无论我尝试测试多少次,这是否只是真假中的一个随机值,如果有时它是假的,它总是设置为真。如果未初始化,值不应该是“随机”的吗?为什么它总是设置为 true(再次当我的类的成员变量在构造时未初始化时)。

我尝试过的解决方案: 显然一个只是初始化构造,但我想到了另一个......

如果在构造时我希望它是真的而不是假的,但是当它没有被构造为设置为假时,那么当我有一个指向我的对象的指针向量时,我可以检查我没有在读取未初始化的对象时通过检查该布尔值是否设置为 true(如果已初始化)或 false 来跟踪指针。我将无法使用将构造初始化为 false 的方法 1,也因为如果我们要反转行为,我不能依赖未初始化的布尔成员变量将是什么,正如我在上面的段落中提到的那样不确定由于我得到的结果而导致的行为。我做了以下,它的工作...

class Testing{
private:
    bool condition{false} // Initalize it here which kind of makes me confused but it works

public:
    Testing() : condition{true} {} // Constructor setting the condition value to true

};

有人可以解释这样做是否是错误的,就我个人而言,我从未见过有人这样做,但我尝试过并且没有给出错误。

4

1 回答 1

2

虽然bool概念上只包含一位信息,但 C++ 标准的要求意味着一个bool对象必须占用至少八位。bool编译器可能在位级别上表示三种主要方式:

  1. 所有位都归零为假;所有位都为真(0x00 与 0xFF)
  2. 所有位都归零为假;最低位为真(0x00 与 0x01)
  3. 所有位都归零为假;至少有一点是真的(0x00 与其他任何东西相比)

(请注意,这种表示选择通常在程序的效果中可见。无论位如何表示,bool当转换为更广泛的整数类型时,a 变为 0 或 1。它仅与正在生成的机器代码相关。 )

在实践中,现代 x86/x64 编译器使用选项 2。有一些指令可以让这变得简单,它使强制转换变得bool微不足道int,并且比较bools 无需额外努力即可工作。

一个副作用是,如果组成bool最终的位设置为 0x37,则可能会发生奇怪的事情,因为可执行代码没有预料到这一点。例如,可以采用 if 语句的两个分支。bool一个好的调试器在看到 a具有意外的位模式时应该大声对您大喊大叫,但实际上它们倾向于将值显示为true.

所有这些选项的共同主题是大多数随机位模式不是false. 因此,如果分配器确实将其设置为“随机”值,它几乎肯定会true在调试器中显示。

于 2020-12-18T12:45:34.873 回答