初探boost之noncopyable學習筆記
noncopyable
功能
同意程序輕松實現一個不可復制的類。
需包括頭文件
#include<boost/noncopyable.hpp> 或
#include<boost/utility.hpp>
原理
在c++定義一個類時。假設不明白定義復制構造函數和復制賦值操作符。編譯器會為我們自己主動生成這兩個函數。
比如
class empty_class{ } ;
實際上類似於
class empty_class
{
public:
empty_class(const empty_class &){...}
empty_class & operator=(const empty_class &){...}
};
但有時候我們不要類的復制語義,希望禁止復制類的實現。比較常見的做法就是私有化復制構造函數和賦值操作符,
手寫代碼也非常easy。如:
class do_not_copy
{
private:
do_not_copy(const do_not_copy &);
void operator=(const do_not_copy &);
};
但假設程序中有大量這種類,反復寫代碼也是非常麻煩的,解決方法也不夠優雅。
noncopyable為實現不可復制的類提供了簡單清晰的解決方式:
這裏使用默認的私有繼承是同意的。顯示的寫出private或public修飾詞也能夠。效果同樣。
我們定義的子類會自己主動私
有化父類noncopyable的復制構造函數。從而禁止用戶從外部訪問復制構造函數和復制賦值函數。
使用方法
以上樣例也改寫為:
class do_not_copy :boost::noncopyable
{...};
舉例
#include<iostream> #include<boost/utility.hpp> #include<boost/noncopyable.hpp> using namespace std; using namespace boost; class student:boost::noncopyable { public: student(int _id):id(_id){}; int print(){return id;} private: int id; }; int main() { student st(100); cout<<st.print()<<endl; student scopy(st); //報錯 cout<<scopy.print()<<endl; return 0; }
若沒有繼承noncopyable
輸出:
100
100
若繼承,如上述代碼,在凝視那句開始報錯。
初探boost之noncopyable學習筆記