美文网首页Exceptional C++
【Exceptional C++(27)】Bool

【Exceptional C++(27)】Bool

作者: downdemo | 来源:发表于2018-01-30 15:41 被阅读6次

    问题

    • 如果没有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对象在条件中作测试

    相关文章

      网友评论

        本文标题:【Exceptional C++(27)】Bool

        本文链接:https://www.haomeiwen.com/subject/lcjczxtx.html