美文网首页
删除函数用法

删除函数用法

作者: dhz120 | 来源:发表于2020-04-11 10:17 被阅读0次

    原则:优先使用删除函数,而不是private未定义的函数

    删除函数的用法

    1. 删除C++会自动生成的特种成员函数,比如拷贝构造函数和赋值运算符
    2. 删除掉有隐式转换造成的非必要的重载版本
    3. (特有) 阻止那些不应该进行的模板具现

    示例

    #ifndef DELFUNCDEMO_H
    #define DELFUNCDEMO_H
    
    // 原则:优先使用删除函数,而不是private未定义的函数
    // 删除函数的用法
    // 1. 删除C++会自动生成的特种成员函数
    // 2. 删除掉有隐式转换造成的非必要的重载版本
    // 3. 特有:阻止那些不应该进行的模板具现
    namespace T14_NS {
    
    class D1 {
    public:
        // 使用默认构造,及系统自己生成的那个
        D1() = default;
    
        // 删除拷贝构造函数和赋值函数,使D1无法拷贝
        // 注意:不用改为private, 因为c++会先校验可访问性,再校验删除状态
        D1(const D1 &) = delete;
        D1& operator=(const D1 &) = delete;
    
    public:
        void lucky(int) {} // 原始版本
        void lucky(double) = delete; // 明确拒绝double和float类型, 即不想要double->int的隐式转换
    };
    
    template <typename T>
    void processPoint(T *) {} // 通用模板,用来处理指针
    template <>
    void processPoint<void>(void *) = delete; // 阻止void*指针,即不支持这种类型
    template <>
    void processPoint<char>(char *) = delete; // 阻止char *指针,即不支持这种类型
    
    
    void test()
    {
        D1 d;
        // 编译报错
        //d = D1();
    
        d.lucky(1); // ok
        // 隐式转换 double->int
        //d.lucky(1.1); // 编译报错
    
        processPoint(&d); // ok
        //processPoint((void *)&d); // 编译报错, 不允许传入void*指针
        char p[] = "hello";
        //processPoint(p); // 编译报错, 不允许传入char*指针
    }
    
    
    } // T14_NS
    
    #endif // DELFUNCDEMO_H
    

    相关文章

      网友评论

          本文标题:删除函数用法

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