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

本文介绍如何通过将拷贝构造函数及拷贝赋值运算符声明为private来防止编译器自动生成默认版本,并利用Uncopyable基类进一步阻止调用未定义的拷贝行为。

  有些情况自己是不希望生成拷贝构造函数以及拷贝赋值运算符的,这种时候不能只是自己不去编写这些函数,因为这样编译器会自动的去生成这些函数。保险一点的做法是将拷贝构造函数以及拷贝赋值运算符都声明为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值