《Effective C++读书笔记》--条款06:若不想使用编译器自动生成的函数,就应该明确拒绝

首先我们要明确,编译器产出的所有函数都是public,因此将成员函数声明为private且故意不去实现他们可以阻止编译器为你自动生成你不想要的函数。但我们在member函数或friend函数中使用该函数时,那么会在连接时发生错误,我们可以将错误迁移至编译阶段,此时的方法就是专门设计一个阻止拷贝动作的基类,这个基类的实现如下:
class Uncopyable{
protected:
    Uncopyable(){}
    ~Uncopyable(){}
private:
    Uncopyable(const Uncopyable&);
    Uncopyable& operator=(const Uncopyable&);
};

然后让我们想实现的类继承这个基类,就可以任何阻止拷贝动作。因为当任何对象(包括member和friend函数)尝试拷贝我们实现的对象时,编译器试着生成一个拷贝构造函数和赋值操作符,这些函数的编译器生成版会调用其基类的对应兄弟,但由于其基类的拷贝构造函数和赋值操作符是private,则编译器就会拒绝该操作。

读到此处我想起了一个问题,如何设计一个仅有一个实例的类,那么就可以将该类的构造函数声明为private,并声明该类的一个指针为static并且是private成员,并在public中返回一个接口指向该指针。同时为了保证正确delete该指针可以设计一个辅助类,在其析构函数中删除,并且在private中声明该辅助类的一个static实例,由于C++在结束时会释放所有静态成员,所以当该类要被delete时,他的private静态成员会被释放,析构函数被调用,从而删除了该唯一的实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值