条款6:如果不想使用编译器自动生成的函数,就应该明确的拒绝。

  有些情况自己是不希望生成拷贝构造函数以及拷贝赋值运算符的,这种时候不能只是自己不去编写这些函数,因为这样编译器会自动的去生成这些函数。保险一点的做法是将拷贝构造函数以及拷贝赋值运算符都声明为private的。这样既阻止了编译器生成默认的版本,而且又阻止了别人去调用它。

    注意上面的这条“将成员函数声明为private而故意的不去实现它”是一种常用手段,即使是标准程序库中有的部分也是这样做的。
class HomeForSale//很明显,销售的两个方子一般内容都是不相同的,所以拷贝构造函数以及
{                //拷贝赋值运算符一般都是不需要的
    public:
        ...
    private:
        ...
        HomeForSale(const HomeForSale &);//注意,这两个函数只有声明
        HomeForSale operator=(const HomeForSale &);
}

  但是这里还存在一个问题就是友元函数以及其他的成员函数还是有可能会调用这两个实际上没有底定义的函数,所以这里还要用到另外一种技巧:可以让HomeForSale继承自一个uncopyable基类即可:

class UnCopyAble
{
    protected:
        UnCopyAble(){}
        ~UnCopyAble(){}
    private:
        UnCopyAble(const UnCopyAble & ){}//禁止拷贝。
        UnCopyAble & operator(const UnCopyAble & )
 }

再让HomeForSale继承自UnCopyAble:

class HomeForSale : public UnCopyAble
{
    public:
        ...
    private:
        ...
}
这样当HomeForSale的友元或者成员函数想要调用赋值或者拷贝构造函数的时候,由于其基类的拷贝以及赋值构造函数是属于private的,所以编译器会拒绝这种操作。
 
小结:为了禁止编译器自动生成的一些功能,可以将相应的成员函数声明称private的不予实现,使用类似UnCopyAble类似的base class也是一种方法。
原文地址:https://www.cnblogs.com/-wang-cheng/p/4854941.html