欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 12:23:40
...
       如果某些事物是独一无二的,那么其相应的类就应该禁止拷贝,也就是要使类的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
{
  ......
};


相关标签: Effective C