meishaoming / blog

MIT License
1 stars 2 forks source link

nocopyable #107

Open meishaoming opened 3 years ago

meishaoming commented 3 years ago

c++ 的类拷贝控制,有两个函数非常关键:

  1. 拷贝构造函数 copy constructor
  2. 拷贝复制运算符 copy assign operator

C++ 里,如果要把让一个类「不可复制」,以前的方法是把这两个函数定义为 private 。 在 C++11 里可以直接把这两个函数定义为 delete

class noncopyable
{
 public:
  noncopyable(const noncopyable&) = delete;
  void operator=(const noncopyable&) = delete;

 protected:
  noncopyable() = default;
  ~noncopyable() = default;
};

由于手动定义了构造函数,所以必须定义一个默认构造函数,这样才能定义对象实例。比如

class A : nocopyable
{
  // ...
};

A aa;

这里定义了类 A 的对象 aa,它必须要用到默认构造函数。所以 nocopyable 里如果没有默认构造函数就无法创建对象。

而其中构造和析构定义 protected ,这里不能是 private,因为 private 也会导致上面的问题。

这里不用 public,可以避免直接用 nocopyable 创建实例,比如:

nocopyable aa;

很显然这不是我们希望的。nocopyable 只能用于作为基类继承,不能直接用来定义对象。