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

来源:互联网 发布:zk和nginx 编辑:程序博客网 时间:2024/05/16 23:53
首先我们要明确,编译器产出的所有函数都是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静态成员会被释放,析构函数被调用,从而删除了该唯一的实例。

阅读全文
0 0