我遇到了一些非常有趣的代码,让我想知道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)
......代码运行正常!
这是我的问题:什么是布尔?它是在逐个实施的基础上定义的吗?从上面显示的证据,我会说它是一个阶级.从实际角度来看(忽略上述内容),将bool定义为int/char的typedef或者将其定义为#define'd似乎也是合适的.但是,如何知道它是什么,(这将影响你如何对待它)?
编辑:我想我会补充说我在VS 2008工作.
abe*_*nky 21
我只是没有看到你描述的"古怪".
你声明一个bool,初始化为true.通过调用函数并通过引用传递它,可以将其值更改为false.
然后你打印出值,它的工作原理.问题是什么?更确切地说,有什么证据表明发生了奇怪的事情?
由于您想知道细节,bool可能是byte(char)或int.当您为其指定true/false时,它将获取值0或1.(使用sizeof并printf("%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)
bool是一种基本类型; true并且false是bool已初始化的类型的对象可以具有的唯一两个值.
你的函数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在这种情况下将永远为真).