Noncopyable

文章目录
  1. 1. 将函数声明为 private
  2. 2. c++11 使用 delete关键字
  3. 3. 参考资料

在 Muduo 中,有一个 noncopyable 类,继承了该类的派生类不能被拷贝,只能被移动。涉及拷贝的函数有两个:拷贝构造函数和拷贝复制操作符。将这两个方法声明为不可访问或者删除,就可以达到不可拷贝的效果。

将函数声明为 private

将拷贝构造函数和拷贝复制操作符声明为 private,能阻止编译器创建这两个函数,同时阻止用户调用他们,从而达到阻止拷贝的效果。

1
2
3
4
5
6
7
8
9
class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private:// emphasize the following members are private
noncopyable( const noncopyable& );
noncopyable& operator=( const noncopyable& );
};

使用方法如下:

1
class foo: private noncopyable{};

一定要使用 private 来继承,防止 member 函数和 friend 函数访问。

c++11 使用 delete关键字

代码如下:

1
2
3
4
5
6
7
8
class noncopyable {
protected:
noncopyable() = default;
~noncopyable() = default;
private:
noncopyable(const noncopyable&) = delete;
const noncopyable& operator=( const noncopyable& ) = delete;
};

把构造函数和析构函数设置为 protected 权限,这样子类可以调用,外面的其他类不能调用。

使用 delete 关键字禁止编译器自动产生 copy 构造函数,和copy assignment ctor。

参考资料