Open meishaoming opened 3 years ago
c++ 的类拷贝控制,有两个函数非常关键:
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 只能用于作为基类继承,不能直接用来定义对象。
c++ 的类拷贝控制,有两个函数非常关键:
C++ 里,如果要把让一个类「不可复制」,以前的方法是把这两个函数定义为 private 。 在 C++11 里可以直接把这两个函数定义为 delete
由于手动定义了构造函数,所以必须定义一个默认构造函数,这样才能定义对象实例。比如
这里定义了类 A 的对象 aa,它必须要用到默认构造函数。所以 nocopyable 里如果没有默认构造函数就无法创建对象。
而其中构造和析构定义 protected ,这里不能是 private,因为 private 也会导致上面的问题。
这里不用 public,可以避免直接用 nocopyable 创建实例,比如:
很显然这不是我们希望的。nocopyable 只能用于作为基类继承,不能直接用来定义对象。