什么是C++中的bool?

ada*_*m_0 4 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?
}
Run Code Online (Sandbox Code Playgroud)

这段代码运行 - 没有错误 - 并打印"thisBool是假的"!

为了进一步使这个奇怪,我运行以下代码:

bool myBool = new bool();
Run Code Online (Sandbox Code Playgroud)

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

在你去寻求一个"noobish"问题之前,我会向你投票

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

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

abe*_*nky 21

我只是没有看到你描述的"古怪".

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

然后你打印出值,它的工作原理.问题是什么?更确切地说,有什么证据表明发生了奇怪的事情?

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

我怀疑,真正的问题是,你不明白的传递通过引用boolPtrHere.你没有传递指向bool的指针.您通过内存引用传递实际值.(把它想象成一个你不需要去引用的指针).


rlb*_*ond 13

void boolPtrHere(bool& theBool)
{
    theBool = false; // uhh, dereferencing anyone?
}
Run Code Online (Sandbox Code Playgroud)

这段代码没有错.bool是参考.不需要解除引用.

bool myBool = new bool();
Run Code Online (Sandbox Code Playgroud)

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

int* my_int = malloc(10 * sizeof(int));
if (!my_int) // my_int is converted to bool
    memory_error();
Run Code Online (Sandbox Code Playgroud)

  • 好吧,除了在内存耗尽的情况下,指定`nothrow`语义.但是,是的,我认为这是迂腐.:) (4认同)
  • @Mike:没关系.我只是重新阅读我的评论,并意识到我写了"新布尔"从不抛出...我的意思是永远不会返回0!:■ (3认同)
  • 正如所写的那样,这个表达式永远不会导致`myBool`错误.其他表达显然可以,但枚举它们并没有太大的收获. (2认同)

Jam*_*lis 9

bool是一种基本类型; true并且falsebool已初始化的类型的对象可以具有的唯一两个值.

你的函数boolPtrHere()没有指向a bool(这将是a bool*); 它需要参考 a bool.它的工作方式与C++中的任何其他引用相同.

至于你的最后一个例子:

bool myBool = new bool();
Run Code Online (Sandbox Code Playgroud)

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