在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服務器,歡迎你們交流指導。指針