什么是C ++中的bool?

时间:2010-07-16 23:24:35

标签: c++ boolean

我遇到了一些非常有趣的代码,让我想知道什么是bool。我一直认为它是一个原始类型,如int或char或long。但今天,我看到的东西看起来像这样:

void boolPtrTest()
{
    bool thisBool = true;

    boolPtrHere(thisBool);

    printf("thisBool is %s\n", thisBool ? "true" : "false");
}

void boolPtrHere(bool& theBool)
{
    theBool = false; // uhh, dereferencing anyone?
}

此代码运行 - 没有错误 - 并打印“thisBool is false”!

为了进一步说明这一点,我运行了以下代码:

bool myBool = new bool();

......代码运行正常!

在你去寻求一个“noobish”问题之前,我要向你投票

这是我的问题:什么 bool?它是在逐个实施的基础上定义的吗?从上面显示的证据,我会说它是一个阶级。从实际角度来看(忽略上述内容),将bool定义为int / char的typedef或者将其定义为#define'd似乎也是合适的。但是如何知道它是什么(哪会影响你如何对待它)?

编辑:我想我会补充说我在VS 2008工作。

8 个答案:

答案 0 :(得分:21)

我只是没有看到你描述的“古怪”。

您声明bool,初始化为true。 通过调用函数并通过引用传递它,可以将其值更改为false

然后打印出值,它就可以了。 问题是什么?更确切地说,有什么证据表明发生了一些奇怪的事情?

由于您想知道详细信息,bool可能是字节(char)或int。 当您为其指定true / false时,它将获取值0或1.(使用sizeofprintf("%d")进行检查)。

我怀疑真正的问题是你不理解boolPtrHere传递引用。你将指针传递给bool。您通过内存引用传递实际值。 (把它想象成一个你不需要去引用的指针)。

答案 1 :(得分:13)

void boolPtrHere(bool& theBool)
{
    theBool = false; // uhh, dereferencing anyone?
}

此代码没有任何问题。 bool是通过引用获取的。不需要解除引用。

bool myBool = new bool();

new返回一个转换为true的地址,因为它永远不会返回非零值。这是一种常见的转换,尤其是在C代码中:

int* my_int = malloc(10 * sizeof(int));
if (!my_int) // my_int is converted to bool
    memory_error();

答案 2 :(得分:9)

bool是一种基本类型; truefalse是已初始化的bool类型的对象可以拥有的唯一两个值。

您的函数boolPtrHere()没有指向bool(这将是bool*);它需要引用bool。它的工作方式与C ++中的任何其他引用一样。

至于你的上一个例子:

bool myBool = new bool();

在C ++中,指针可以隐式转换为bool。新表达式返回指向动态分配的bool对象的指针。然后将此指针转换为bool并存储在myBool中。如果指针为null,那么myBool将为false;否则它将是真的(因为new永远不会返回null,在这种情况下myBool将永远为真)。

答案 3 :(得分:4)

Bool是一个定义良好的原始整数类型,就像int,char等一样。它还有其他整数类型的数学转换,这有时会让人感到困惑,但我不认为这是你目前的困惑。

我不确定您对包含的第一个代码段有何看法。 Bools可以像其他任何东西一样引用。似乎你可能对指针和引用之间的区别感到困惑。

至于第二个代码片段,这有点棘手。这实际上是一个内存泄漏,如果我们以不同的方式编写它,它应该变得更清楚它在做什么:

 bool myBool = (new bool) != 0 ? true : false;
从那里,您可以看到这样做是从堆中分配bool,然后将结果与NULL / 0进行比较,并使用该比较的结果来赋值给布尔值。请注意,最初从堆分配的值被泄露。我有点意外,这不会为你生成编译器错误,我会怀疑它会对某些编译器产生错误。

答案 4 :(得分:1)

不需要取消引用引用。指针。

答案 5 :(得分:0)

这样想:

typedef enum { false=0, true=1 } bool;

答案 6 :(得分:0)

  

我一直认为这是一个   原始类型,如int或char或   长。

您似乎从Java角度看C ++。在Java中,原始类型总是按值传递,而其他类型总是引用。

C ++与众不同。如果以这种方式声明,任何类型都可以是引用。您也可以声明int &xint *x,因此bool没有什么奇怪的。

答案 7 :(得分:0)

关于布尔的一个非常小的惊喜是sizeof(bool) >= 1。 bool需要一个完整的存储字节。这样它们可以具有唯一的地址并被指向,如boolPtrHere函数。