在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 关键字能够很方便地实现。服务器
class noncopyable { public: noncopyable(const noncopyable&) = delete; noncopyable& operator=(const noncopyable&) = delete; };
boot::noncopyable
的实现结合了前面两种方法:函数
class noncopyable { protected: // 默认的构造函数和析构函数是 protected, // 不容许建立 noncopyable 实例,但容许子类建立实例 // (即容许派生类构造和析构)。 noncopyable() = default; ~noncopyable() = default; private: // 使用 delete 关键字禁止编译器自动产生复制构造函数和复制赋值操做符。 noncopyable(const noncopyable&) = delete; const noncopyable& operator=(const noncopyable&) = delete; };
为何不少人禁用拷贝(复制)构造函数中提到,阻止拷贝有几点限制:设计
原型模式
,在C++中没有拷贝构造函数,这个模式实现可能比较困难。我本身模仿muduo写了一个HTTP服务器,欢迎你们交流指导。指针