美文网首页程序员
[C++进阶]若不想使用编译器自动生成的函数,就该明确拒绝

[C++进阶]若不想使用编译器自动生成的函数,就该明确拒绝

作者: 小鱼号的代码日记 | 来源:发表于2020-06-21 22:51 被阅读0次

    若不想使用编译器自动生成的函数,就该明确拒绝

    独一无二的实例不允许被复制

    例如:待售卖的房子

    编译器产出的函数都是public

    因此你可以将copy构造函数和copy assignment操作符声明为private

    这样做并不绝对安全 因为member函数和friend函数还是可以调用你的private函数

    因此需要将函数声明为private而且故意不实现它们(连接期报错)

    将连接期报错移至编译期是可能的

    需要提供一个基类将copy构造函数和copy assignment操作符声明为private

    总结:

    为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现

    使用像uncopyable这样的base class 也是一种做法。

    /***************************
    effectivre c++
    改善程序与设计的55个具体做法
    条款6:若不想使用编译器自动生成的函数,就该明确拒绝
     ---------小鱼号的代码日记--------------
    ****************************/
    /**************************
    
    ***************************/
    
    class Uncopyable
    {
    public:
        Uncopyable()
        {}
        ~Uncopyable()
        {}
       private:
       Uncopyable(const Uncopyable&);
       Uncopyable& operator=(const Uncopyable&);
    };
    /**************************
    独一无二的实例不允许被复制
    例如:待售卖的房子
    ***************************/
    class HomeForSale :private Uncopyable
    {
    public:
        HomeForSale()
        {}
       private:
       ///继承Uncopyable就不再声明copy构造函数和copy assignment操作符
       //HomeForSale(const HomeForSale&);
       //HomeForSale& operator=(const HomeForSale&);
    };
    int main()
    {
        HomeForSale h1;
        HomeForSale h2;
        ///HomeForSale h3(h1);//企图拷贝h1-不该通过编译
        ///h1 = h2;//企图拷贝h2-不该通过编译
    
        ///编译器产出的函数都是public
        ///因此你可以将copy构造函数和copy assignment操作符声明为private
        ///这样做并不绝对安全 因为member函数和friend函数还是可以调用你的private函数
        ///因此需要将函数声明为private而且故意不实现它们(连接期报错)
        ///将连接期报错移至编译期是可能的
        ///需要提供一个基类将copy构造函数和copy assignment操作符声明为private
       return 0;
    }
    /**************************
    总结:
    为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现
    使用像uncopyable这样的base class 也是一种做法。
    ***************************/
    
    
    
    内容选自:
    effectivre c++
    改善程序与设计的55个具体做法

    相关文章

      网友评论

        本文标题:[C++进阶]若不想使用编译器自动生成的函数,就该明确拒绝

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