《Effective C++》条款6:如何避免使用编译器自动生成的函数

本章节针对于条款6做出了一个补充,旨在指出如何避免使用编译器的默认四大函数,即构造、析构、copy、assignment copy四类函数;

 

由于某些情况下我们不希望copy和assignment copy的存在,保持每个实例化类的独一无二;

但是如果不进行指定,会让编译器默认构造,所以必须要寻求某种方法,使得这这两个函数失效;

 

总的来说,书上提供了三种思路:

1.进行声明,但是不做任何操作——最简单的方法;

 

2.进行声明,不做任何操作,但是把他定义为private,防止子类和基类调用——第一种方法的提升,也是大部分标准库所采用的方法;

但是第二种方法存在缺陷,即友元函数或者成员函数可能会成功调用,尤其是友元类或者友元函数,可能其他编写者会不知情下进行调用;

 

3.设置一个uncopyable基类,所需类在此基础上进行派生,并且将赋值和符号赋值函数定义为private,来防止子类进行继承,和第二种方法如出一辙;

class Uncopyable {
protected:
	Uncopyable() {}
	~Uncopyable() {}
private:
	Uncopyable(const Uncopyable&);
	Uncopyable& operator=(const Uncopyable&);
};

class dri_:private Uncopyable{};

如上所示,通过继承Uncopyable既可以保证赋值和符号赋值不会被默认产生,也会保证析构和构造函数完美使用,一举两得;

 

所以自己写还是别学标准库private那一套,直接使用基类Uncopyable继承;

posted @ 2020-12-03 15:46  暮云林凌  阅读(58)  评论(0)    收藏  举报