初探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為實現不可復制的類提供了簡單清晰的解決方式:從 boost::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

若繼承,如上述代碼,在凝視那句開始報錯。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM