C++ noncopyable类

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

将函数声明为private

将拷贝构造函数和拷贝复制操做符声明为 private,能阻止编译器建立这两个函数,同时阻止用户调用它们,从而达到阻止拷贝的效果。实现以下:c++

class noncopyable {
public:
    ...
private:
    
    noncopyable(const noncopyable&);
    noncopyable& operator=(const noncopyable&);
};

《Effective C++》第三版 条款06介绍的就是这种实现。git

使用方法:github

class myClass : private noncopyable {};

注意:此处必定要使用 private 继承,以防止 member 函数和 friend 函数访问。设计模式

C++ 11 下使用 delete 关键字

C++ 11 下可使用 delete 关键字能够很方便地实现。服务器

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

Boost 中的实现

boot::noncopyable的实现结合了前面两种方法:函数

class noncopyable {
protected:
    // 默认的构造函数和析构函数是 protected,
    // 不容许建立 noncopyable 实例,但容许子类建立实例
    // (即容许派生类构造和析构)。
    noncopyable() = default;
    ~noncopyable() = default;

private:
    // 使用 delete 关键字禁止编译器自动产生复制构造函数和复制赋值操做符。
    noncopyable(const noncopyable&) = delete;
    const noncopyable& operator=(const noncopyable&) = delete;
};

阻止拷贝的限制

为何不少人禁用拷贝(复制)构造函数中提到,阻止拷贝有几点限制:设计

  • 在C++11以前对象必须有正常的拷贝语义才能放入容器中,禁用拷贝构造的对象没法直接放 入容器中,固然你可使用指针来规避这一点,可是你又落入了本身管理指针的困境之中 (或许使用智能指针能够缓解这一问题)。
  • C++11中存在移动语义,你能够经过移动而不是拷贝把数据放入容器中。
  • 拷贝构造函数的另外一个应用在于设计模式中的原型模式,在C++中没有拷贝构造函数,这个模式实现可能比较困难。

广告

我本身模仿muduo写了一个HTTP服务器,欢迎你们交流指导。指针

参考

相关文章
相关标签/搜索