我遇到了一些非常有趣的代码,让我想知道什么是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();
......代码运行正常!
这是我的问题:什么是 bool?它是在逐个实施的基础上定义的吗?从上面显示的证据,我会说它是一个阶级。从实际角度来看(忽略上述内容),将bool定义为int / char的typedef或者将其定义为#define'd似乎也是合适的。但是如何知道它是什么(哪会影响你如何对待它)?
编辑:我想我会补充说我在VS 2008工作。答案 0 :(得分:21)
我只是没有看到你描述的“古怪”。
您声明bool
,初始化为true
。
通过调用函数并通过引用传递它,可以将其值更改为false
。
然后打印出值,它就可以了。 问题是什么?更确切地说,有什么证据表明发生了一些奇怪的事情?
由于您想知道详细信息,bool
可能是字节(char
)或int
。
当您为其指定true / false时,它将获取值0或1.(使用sizeof
和printf("%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
是一种基本类型; true
和false
是已初始化的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 &x
或int *x
,因此bool没有什么奇怪的。
答案 7 :(得分:0)
关于布尔的一个非常小的惊喜是sizeof(bool) >= 1
。 bool需要一个完整的存储字节。这样它们可以具有唯一的地址并被指向,如boolPtrHere
函数。