文章參考了這里http://blog.csdn.net/huang_xw/article/details/8248960
boost::noncopyable 比較簡單, 主要用于單例的情況.
通常情況下, 要寫一個單例類就要在類的聲明把它們的構造函數, 賦值函數, 析構函數, 拷貝構造函數隱藏到 private 或者 protected 之中, 每個類都這么干的話會非常地麻煩.
但是有了 noncopyable 類之后, 只要讓單例類直接繼承 noncopyable, 一切都會迎刃而解.
class noncopyable 的基本思想是把構造函數和析構函數設置 protected 權限,這樣子類可以調用,但是外面的類不能調用,那么當子類需要定義構造函數的時候不至于通不過編譯。但是最關鍵的是noncopyable 把復制構造函數和復制賦值函數做成了 private,這就意味著 除非子類定義自己的copy構造和賦值函數,否則在子類沒有定義的情況下,外面的調用者是不能夠通過賦值和copy構造等手段來產生一個新的子類對象的。
如果代碼中沒有子類的賦值或者拷貝操作,編譯器是不會為我們生成默認的賦值函數和拷貝構造函數的,一旦代碼中出現了這些操作,而子類并沒有定義自己的copy構造函數和賦值函數,那么編譯器試圖為子類生成,生成的函數首先要調用父類的copy構造函數或者賦值函數,而這兩個函數都為 private 類型,自然是無法訪問的,因此在編譯器就會報錯.
#ifndef BOOST_NONCOPYABLE_HPP_INCLUDED
#define BOOST_NONCOPYABLE_HPP_INCLUDED
namespace boost {
// Private copy constructor and copy assignment ensure classes derived from
// class noncopyable cannot be copied.
// Contributed by Dave Abrahams
namespace noncopyable_ // protection from unintended ADL
{
class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private: // emphasize the following members are private
noncopyable( const noncopyable& );
const noncopyable& operator=( const noncopyable& );
};
}
typedef noncopyable_::noncopyable noncopyable;
} // namespace boost
#endif // BOOST_NONCOPYABLE_HPP_INCLUDED
給一個示例:
#include "tfun.h"
class myclass: public boost::noncopyable
{
public:
myclass(){};
myclass(int i){};
};
int main()
{
myclass cl1();
myclass cl2(1);
// myclass cl3(cl1); // error
// myclass cl4(cl2); // error
return 0;
}