1. 程式人生 > >初探boost之noncopyable學習筆記

初探boost之noncopyable學習筆記

私有繼承 tracking name oid 功能 div code sof _id

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

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

初探boost之noncopyable學習筆記