Effective C++笔记之六:使用noncopyable禁止类的拷贝

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/caoshangpa/article/details/79493285
       如果某些事物是独一无二的,那么其相应的类就应该禁止拷贝,也就是要使类的copy构造函数和copy assignment操作符不起作用。比如说,地球就是独一无二的,那么可以这么定义地球:
class Earth {
public:
  ......//member函数或friend函数
private:
  Earth(const Earth&);//只声明
  Earth& operator=(const Earth&);//只声明
};
       有了上述class 定义,当客户企图拷贝Earth对象,编译器会阻挠他。如果你不慎在member函数或friend函数之内那么做,轮到连接器发出抱怨。但是一种更好的做法是将连接期错误移至编译期,毕竟愈早侦测出错误愈好。此时可以专门设计一个阻止copying动作的base class,如下所示:
class noncopyable
{
protected:
  noncopyable() {}
  ~noncopyable() {}
private:// emphasize the following members are private
  noncopyable( const noncopyable& );
  noncopyable& operator=( const noncopyable& );
};
       对于构造函数为什么声明成protected呢?首先肯定不能为private,不然无法构造子类实例。如果为public,那么外部是可以创建noncopyable这么一个实例的,可是这个实例是完全没有意义的,该类只有在被继承之后才有意义。所以此处声明为protected是非常恰当合适的,既保证外部无法直接构造一个无意义的noncopyable实例,又不影响构造子类实例。
       现在,为了阻止Earth对象被拷贝,我们唯一需要做的就是继承Uncopyable。当然,此时Earth内部不需要再声明copy构造函数和copy assignment操作符了。
class Earth:private noncopyable
{
  ......
};


展开阅读全文

没有更多推荐了,返回首页