【Exceptional C++(27)】Bool
2018-01-30 本文已影响6人
downdemo
问题
- 如果没有bool类型,能用已有的数据类型达到相同效果吗?
解答
- 不能,bool型和true,false无法通过现有的语言特性准确实现,下面是尝试实现
typedef int bool;
const bool true = 1;
const bool false = 0;
// 这种方法不允许重载bool,例如
// file f.h
void f(int); // OK
void f(bool); // OK,声明相同函数
// file f.cpp
void f(int) { ... } // OK
void f(bool) { ... } // 错误,重定义
// 另一个问题是跟这相同的代码
void f(bool b) {
assert(b != true && b != false);
}
- typedef ... bool的主要问题是不允许重载
#define bool int
#define true 1
#define false 0
- 这种方法是很糟糕的,不仅有和typedef相同的问题,还破坏了#define
enum bool { false, true };
// 比起typedef的好处是允许重载
// 但在条件表达式不允许自动类型转换
bool b;
b = (i == j); // 错误,int不能隐式转换成enum
- enum bool允许重载,但在条件表达式中不能进行自动类型转换
class bool {
public:
bool();
bool(int); // 允许在条件表达式中转换
operator=(int);
// operator int(); // 有问题
// operator void*(); // 有问题
private:
unsigned char b_;
};
const bool true(1);
const bool false(0);
// 如果不使用自动类型转换,无法用在条件判断中
bool b;
if (b) // 错误,不能转换与int或void*相似的类型
...
- bool类允许重载但不能让bool对象在条件中作测试